回答:
ご想像のとおり、正しい構文は
del df['column_name']
del df.column_name
Pythonの構文上の制限の結果として単に機能させることは困難です。Pythonのカバーの下でdel df[name]
翻訳さdf.__delitem__(name)
れます。
class A(object): def __init__(self): self.var = 1
クラスを設定して、a = A(); del a.var
del df[name]
、df.__delitem__(name)
DataFrameが実装して必要に応じて変更できるメソッドに変換されます。の場合、del df.name
カスタム変数が実行される機会なしにメンバー変数が削除されます。あなた自身の例を考えてみてください-あなたdel a.var
は「変数を削除する」という結果を得ることができますか?できれば教えてください。できません:)
pandas
開発者はそうではありませんでしたが、それが難しいことを意味するわけではありません。
パンダでこれを行う最良の方法は、使用することdrop
です:
df = df.drop('column_name', 1)
ここで、1
ある軸の数(0
行および1
列に対しては)。
再割り当てせずに列を削除するには、次のようにしますdf
。
df.drop('column_name', axis=1, inplace=True)
最後に、列ラベルではなく列番号でドロップするには、これを試して、たとえば1番目、2番目、4番目の列を削除します。
df = df.drop(df.columns[[0, 1, 3]], axis=1) # df.columns is zero-based pd.Index
列の「テキスト」構文も使用します。
df.drop(['column_nameA', 'column_nameB'], axis=1, inplace=True)
del
は何らかの理由で推奨されますか?
drop
上はdel
つまりdrop
、あなたが(特に3-Dマトリックスのために有用な、または任意の軸に沿って操作インプレースか否か、また、削除レコードを、一度に複数の列を削除実行することを可能にするPanel
)
使用する:
columns = ['Col1', 'Col2', ...]
df.drop(columns, inplace=True, axis=1)
これにより、1つ以上の列がインプレースで削除されます。inplace=True
pandas v0.13で追加され、古いバージョンでは動作しないことに注意してください。その場合、結果を割り当てる必要があります。
df = df.drop(columns, axis=1)
df.drop(list,inplace=True,axis=1)
del
です。一度に複数の列をドロップする可能性があります。
1列目、2列目、4列目を削除します。
df.drop(df.columns[[0,1,3]], axis=1, inplace=True)
最初の列を削除:
df.drop(df.columns[[0]], axis=1, inplace=True)
inplace
コピーを作成せずに元のデータを変更できるように、オプションのパラメーターがあります。
列を削除column-name
:
df.pop('column-name')
df = DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6]), ('C', [7,8, 9])], orient='index', columns=['one', 'two', 'three'])
print df
:
one two three
A 1 2 3
B 4 5 6
C 7 8 9
df.drop(df.columns[[0]], axis=1, inplace=True)
print df
:
two three
A 2 3
B 5 6
C 8 9
three = df.pop('three')
print df
:
two
A 2
B 5
C 8
df.T.pop('A')
df
。あなたがすることdf = df.T; df.pop(index); df = df.T
ができますが、これは過度に思えます。
df.drop(df.columns[[0]], axis=1, inplace=True)
それを使用するのに十分で はないでしょうdf.drop([0], axis=1)
か?
0
、df.drop(0, axis=1)
うまくいきます。ただし、列名がわからず、最初の列を削除してからが必要な場合はdf.drop(df.columns[[0]], axis=1, inplace=True)
、位置で最初の列を選択してドロップします。
ここでのほとんどの回答で見逃された実際の質問は次のとおりです。
del df.column_name
ですか?最初に問題を理解する必要があります。これには、Pythonマジックメソッドに飛び込む必要があります。
ウェスが指摘するように、彼の答えはでdel df['column']
のpythonにマップマジックメソッド df.__delitem__('column')
されて列を削除するパンダに実装します
しかし、約上記のリンクで指摘Pythonの魔法の方法:
実際、
__del__
それが呼び出される不安定な状況のため、ほとんど使用すべきではありません。注意して使用してください!
あなたはdel df['column_name']
それを使用したり奨励したりdel df.column_name
すべきではなく、それによって考慮すべきではないと主張することができます。
ただし、理論的にdel df.column_name
は、魔法の方法__delattr__
を使用してパンダで動作するように実装できます。ただし、これにより特定の問題が発生します。del df['column_name']
実装にはすでに問題がありますが、程度は低いです。
「dtypes」または「columns」と呼ばれるデータフレームに列を定義するとどうなりますか?
次に、これらの列を削除するとします。
del df.dtypes
__delattr__
「dtypes」属性または「dtypes」列を削除する必要があるかのように、メソッドを混乱させます。
.ix
、.loc
または.iloc
メソッドを使用できます。del df.column_name
このような認知的不協和がユーザーに発生しないようにするために、パンダは非常に乱暴に成長したアーキテクチャを再検討する必要があるため、これを行うことはできません。
df.column_nameは使用しないでください。見栄えは良いかもしれませんが、認知的不協和が発生します
列を削除する方法は複数あります。
それを行うには、明白な方法が1つ(できれば1つだけ)あるはずです。
列は属性である場合とそうでない場合があります。
特別なケースは、ルールを破るほど特別ではありません。
んdel df.dtypes
dtypes属性またはdtypes列を削除しますか?
あいまいな状況に直面して、推測する誘惑を拒否してください。
__del__
それが呼び出される不安定な状況のため、ほとんど使用すべきではありません。注意して使用してください!」ここで使用されているメソッドはなので、ここでは完全に無関係です__delattr__
。
del
意味する組み込み、ない.__del__
インスタンスメソッド。del
組み込みはにマッピングしている__delattr__
と__delitem__
私は上の私の議論を構築しています何です。だから、多分あなたは私が書いたものをもう一度読みたいと思うでしょう。
__
... __
はStackExchangeによって太字のマークアップとして解釈されます
すばらしい追加は、列が存在する場合にのみ列をドロップする機能です。このようにして、より多くのユースケースをカバーでき、渡されたラベルから既存の列のみを削除します。
たとえば、単純にerrors = 'ignore'を追加します。
df.drop(['col_name_1', 'col_name_2', ..., 'col_name_N'], inplace=True, axis=1, errors='ignore')
Pandasバージョン0.21では、およびメソッドのシグネチャと一致するようにおよびパラメータのdrop
両方が含まれるようにメソッドが少し変更されました。index
columns
rename
reindex
df.drop(columns=['column_a', 'column_c'])
個人的にaxis
は、ほとんどすべてのパンダメソッドで使用される主要なキーワードパラメーターであるため、列またはインデックスを示すためにパラメーターを使用することを好みます。しかし、バージョン0.21では、いくつかの選択肢が追加されています。
わずかに効率的なソリューションを見つけるための多くの努力。追加された複雑さを正当化することは困難ですが、df.drop(dlst, 1, errors='ignore')
df.reindex_axis(np.setdiff1d(df.columns.values, dlst), 1)
プリアンブル
列を削除することは、他の列を選択することと意味的に同じです。考慮すべき追加の方法をいくつか示します。
また、一度に複数の列を削除し、存在しない列を削除するための一般的な解決策にも焦点を当てます。
これらのソリューションの使用は一般的であり、単純なケースでも機能します。
セットアップを
検討し、pd.DataFrame
df
削除するリストdlst
df = pd.DataFrame(dict(zip('ABCDEFGHIJ', range(1, 11))), range(3))
dlst = list('HIJKLM')
df
A B C D E F G H I J
0 1 2 3 4 5 6 7 8 9 10
1 1 2 3 4 5 6 7 8 9 10
2 1 2 3 4 5 6 7 8 9 10
dlst
['H', 'I', 'J', 'K', 'L', 'M']
結果は次のようになります。
df.drop(dlst, 1, errors='ignore')
A B C D E F G
0 1 2 3 4 5 6 7
1 1 2 3 4 5 6 7
2 1 2 3 4 5 6 7
列を削除することは他の列を選択することと同じなので、次の2つのタイプに分けます。
削除したい列なしで、保持したい列を表すラベルのリスト/配列を作成することから始めます。
df.columns.difference(dlst)
Index(['A', 'B', 'C', 'D', 'E', 'F', 'G'], dtype='object')
np.setdiff1d(df.columns.values, dlst)
array(['A', 'B', 'C', 'D', 'E', 'F', 'G'], dtype=object)
df.columns.drop(dlst, errors='ignore')
Index(['A', 'B', 'C', 'D', 'E', 'F', 'G'], dtype='object')
list(set(df.columns.values.tolist()).difference(dlst))
# does not preserve order
['E', 'D', 'B', 'F', 'G', 'A', 'C']
[x for x in df.columns.values.tolist() if x not in dlst]
['A', 'B', 'C', 'D', 'E', 'F', 'G']
ラベルの列
選択プロセスを比較するために、次のことを前提としています。
cols = [x for x in df.columns.values.tolist() if x not in dlst]
次に評価できます
df.loc[:, cols]
df[cols]
df.reindex(columns=cols)
df.reindex_axis(cols, 1)
これらはすべて次のように評価されます。
A B C D E F G
0 1 2 3 4 5 6 7
1 1 2 3 4 5 6 7
2 1 2 3 4 5 6 7
スライスするためのブール値の配列/リストを作成できます
~df.columns.isin(dlst)
~np.in1d(df.columns.values, dlst)
[x not in dlst for x in df.columns.values.tolist()]
(df.columns.values[:, None] != dlst).all(1)
ブール値からの列
比較のため
bools = [x not in dlst for x in df.columns.values.tolist()]
df.loc[: bools]
これらはすべて次のように評価されます。
A B C D E F G
0 1 2 3 4 5 6 7
1 1 2 3 4 5 6 7
2 1 2 3 4 5 6 7
堅牢なタイミング
機能
setdiff1d = lambda df, dlst: np.setdiff1d(df.columns.values, dlst)
difference = lambda df, dlst: df.columns.difference(dlst)
columndrop = lambda df, dlst: df.columns.drop(dlst, errors='ignore')
setdifflst = lambda df, dlst: list(set(df.columns.values.tolist()).difference(dlst))
comprehension = lambda df, dlst: [x for x in df.columns.values.tolist() if x not in dlst]
loc = lambda df, cols: df.loc[:, cols]
slc = lambda df, cols: df[cols]
ridx = lambda df, cols: df.reindex(columns=cols)
ridxa = lambda df, cols: df.reindex_axis(cols, 1)
isin = lambda df, dlst: ~df.columns.isin(dlst)
in1d = lambda df, dlst: ~np.in1d(df.columns.values, dlst)
comp = lambda df, dlst: [x not in dlst for x in df.columns.values.tolist()]
brod = lambda df, dlst: (df.columns.values[:, None] != dlst).all(1)
テスト中
res1 = pd.DataFrame(
index=pd.MultiIndex.from_product([
'loc slc ridx ridxa'.split(),
'setdiff1d difference columndrop setdifflst comprehension'.split(),
], names=['Select', 'Label']),
columns=[10, 30, 100, 300, 1000],
dtype=float
)
res2 = pd.DataFrame(
index=pd.MultiIndex.from_product([
'loc'.split(),
'isin in1d comp brod'.split(),
], names=['Select', 'Label']),
columns=[10, 30, 100, 300, 1000],
dtype=float
)
res = res1.append(res2).sort_index()
dres = pd.Series(index=res.columns, name='drop')
for j in res.columns:
dlst = list(range(j))
cols = list(range(j // 2, j + j // 2))
d = pd.DataFrame(1, range(10), cols)
dres.at[j] = timeit('d.drop(dlst, 1, errors="ignore")', 'from __main__ import d, dlst', number=100)
for s, l in res.index:
stmt = '{}(d, {}(d, dlst))'.format(s, l)
setp = 'from __main__ import d, dlst, {}, {}'.format(s, l)
res.at[(s, l), j] = timeit(stmt, setp, number=100)
rs = res / dres
rs
10 30 100 300 1000
Select Label
loc brod 0.747373 0.861979 0.891144 1.284235 3.872157
columndrop 1.193983 1.292843 1.396841 1.484429 1.335733
comp 0.802036 0.732326 1.149397 3.473283 25.565922
comprehension 1.463503 1.568395 1.866441 4.421639 26.552276
difference 1.413010 1.460863 1.587594 1.568571 1.569735
in1d 0.818502 0.844374 0.994093 1.042360 1.076255
isin 1.008874 0.879706 1.021712 1.001119 0.964327
setdiff1d 1.352828 1.274061 1.483380 1.459986 1.466575
setdifflst 1.233332 1.444521 1.714199 1.797241 1.876425
ridx columndrop 0.903013 0.832814 0.949234 0.976366 0.982888
comprehension 0.777445 0.827151 1.108028 3.473164 25.528879
difference 1.086859 1.081396 1.293132 1.173044 1.237613
setdiff1d 0.946009 0.873169 0.900185 0.908194 1.036124
setdifflst 0.732964 0.823218 0.819748 0.990315 1.050910
ridxa columndrop 0.835254 0.774701 0.907105 0.908006 0.932754
comprehension 0.697749 0.762556 1.215225 3.510226 25.041832
difference 1.055099 1.010208 1.122005 1.119575 1.383065
setdiff1d 0.760716 0.725386 0.849949 0.879425 0.946460
setdifflst 0.710008 0.668108 0.778060 0.871766 0.939537
slc columndrop 1.268191 1.521264 2.646687 1.919423 1.981091
comprehension 0.856893 0.870365 1.290730 3.564219 26.208937
difference 1.470095 1.747211 2.886581 2.254690 2.050536
setdiff1d 1.098427 1.133476 1.466029 2.045965 3.123452
setdifflst 0.833700 0.846652 1.013061 1.110352 1.287831
fig, axes = plt.subplots(2, 2, figsize=(8, 6), sharey=True)
for i, (n, g) in enumerate([(n, g.xs(n)) for n, g in rs.groupby('Select')]):
ax = axes[i // 2, i % 2]
g.plot.bar(ax=ax, title=n)
ax.legend_.remove()
fig.tight_layout()
これは、実行にかかる時間に関連していますdf.drop(dlst, 1, errors='ignore')
。結局のところ、私たちはパフォーマンスを適度に向上させるだけのようです。
事実ならば、最良の解決策は、使用reindex
やreindex_axis
ハックにlist(set(df.columns.values.tolist()).difference(dlst))
。近い秒ですが、それでも非常にわずかに優れてdrop
いnp.setdiff1d
ます。
rs.idxmin().pipe(
lambda x: pd.DataFrame(
dict(idx=x.values, val=rs.lookup(x.values, x.index)),
x.index
)
)
idx val
10 (ridx, setdifflst) 0.653431
30 (ridxa, setdifflst) 0.746143
100 (ridxa, setdifflst) 0.816207
300 (ridx, setdifflst) 0.780157
1000 (ridxa, setdifflst) 0.861622
drop()メソッドを使用して、指定した列または特定の列を削除または削除できます。
仮定DFはデータフレームです。
削除する列= column0
コード:
df = df.drop(column0, axis=1)
複数の列col1、col2 、. 。。、coln、リストから削除する必要があるすべての列を挿入する必要があります。次に、それらをdrop()メソッドで削除します。
コード:
df = df.drop([col1, col2, . . . , coln], axis=1)
お役に立てれば幸いです。
df = df.drop([col1, col2, . . . , coln], axis=1)
col1、col2などの代わりに変数名を指定すると、これは機能しません。間違いなく存在する場合、軸にないエラー列が表示されます。@Littin助けてくれませんか?
Pandas DataFrameで列を削除する別の方法
インプレース削除を探していない場合は、DataFrame(...)
関数as を使用して列を指定することにより、新しいDataFrameを作成できます。
my_dict = { 'name' : ['a','b','c','d'], 'age' : [10,20,25,22], 'designation' : ['CEO', 'VP', 'MD', 'CEO']}
df = pd.DataFrame(my_dict)
新しいDataFrameを次のように作成します
newdf = pd.DataFrame(df, columns=['name', 'age'])
あなたはデル/ドロップで得られるものと同じくらい良い結果を得る