DataFrameの列を削除するときは、次を使用します。
del df['column_name']
そして、これはうまく機能します。なぜ以下が使えないのですか?
del df.column_name
として列/シリーズにアクセスできるので、これが機能することdf.column_name
を期待していました。
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)
注: v0.21.0 (2017 年 10 月 27 日) で導入された drop() メソッドは、軸を指定する代わりに index/columns キーワードを受け入れます。
したがって、次のことができます。
df = df.drop(columns=['column_nameA', 'column_nameB'])
ご想像のとおり、正しい構文は次のとおりです。
del df['column_name']
del df.column_name
Python の構文上の制限の結果として、単純に機能させるのは困難です。Python によってカバーの下del df[name]
に変換されます。df.__delitem__(name)
使用する:
columns = ['Col1', 'Col2', ...]
df.drop(columns, inplace=True, axis=1)
これにより、1 つまたは複数の列がインプレースで削除されます。inplace=True
pandas v0.13 で追加されたもので、古いバージョンでは動作しないことに注意してください。その場合、結果を代入する必要があります。
df = df.drop(columns, axis=1)
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
ここでのほとんどの回答で見落とされている実際の質問は次のとおりです。
del df.column_name
ですか?まず、問題を理解する必要があります。そのためには、 Python の魔法のメソッドに飛び込む必要があります。
Wesが彼の回答で指摘しているように、列を削除するために Pandas に実装されているdel df['column']
Pythonマジック メソッド にマップされます。df.__delitem__('column')
ただし、 Python マジック メソッドに関する上記のリンクで指摘されているように:
実際、
__del__
呼び出される状況が不安定であるため、ほとんど使用すべきではありません。注意して使用してください!
del df['column_name']
あなたは、それを使用したり奨励したりすべきではないと主張することができdel df.column_name
ます。
ただし、理論的には、マジック メソッドdel df.column_name
を使用して Pandas で動作するように実装できます。ただし、これにより、特定の問題、実装が既に抱えている問題が発生しますが、程度は低くなります。__delattr__
del df['column_name']
「dtypes」または「columns」と呼ばれるデータフレームで列を定義するとどうなりますか?
次に、これらの列を削除するとします。
del df.dtypes
__delattr__
「dtypes」属性または「dtypes」列を削除する必要があるかのように、メソッドが混乱します。
.ix
いいえ。ただし、必要に応じて、.loc
または.iloc
メソッドを使用できます。Pandas には、この種の認知的不協和がユーザーに発生しないdel df.column_name
ように再検討する必要がある非常に乱暴に成長したアーキテクチャがあるため、できません。
df.column_name を使用しないでください。きれいかもしれませんが、認知的不協和を引き起こします。
列を削除するには、複数の方法があります。
それを行う明白な方法が 1 つ (できれば 1 つだけ) ある必要があります。
列は属性の場合もありますが、そうでない場合もあります。
特別なケースは、ルールを破るほど特別なものではありません。
dtypesdel df.dtypes
属性または dtypes 列を削除しますか?
あいまいさに直面しても、推測する誘惑を断ってください。
優れた追加機能は、列が存在する場合にのみ列を削除できることです。このようにして、より多くのユースケースをカバーでき、渡されたラベルから既存の列のみを削除します。
たとえば、単にerrors='ignore'を追加します。
df.drop(['col_name_1', 'col_name_2', ..., 'col_name_N'], inplace=True, axis=1, errors='ignore')
常に[]
表記を使用することをお勧めします。1つの理由は、属性表記(df.column_name
)が番号付きインデックスでは機能しないことです。
In [1]: df = DataFrame([[1, 2, 3], [4, 5, 6]])
In [2]: df[1]
Out[2]:
0 2
1 5
Name: 1
In [3]: df.1
File "<ipython-input-3-e4803c0d1066>", line 1
df.1
^
SyntaxError: invalid syntax
使用する:
df.drop('columnname', axis =1, inplace = True)
または、一緒に行くことができます
del df['colname']
列番号に基づいて複数の列を削除するには
df.drop(df.iloc[:,1:3], axis = 1, inplace = True)
列名に基づいて複数の列を削除するには
df.drop(['col1','col2',..'coln'], axis = 1, inplace = True)
不要な値を含む典型的な列名がある場合に、とのiloc
関数を使用して列を削除します。dataframe
slicing
df = df.iloc[:,1:] # Removing an unnamed index column
これ0
がデフォルトの行で1
あり、最初の列であるため:,1:
、最初の列を削除するためのパラメーターです。
ドット構文は JavaScript では機能しますが、Python では機能しません。
del df['column_name']
del df['column_name']
または del df.column_name
特定の列の前後の列を削除するには、メソッドtruncateを使用できます。例えば:
A B C D E
0 1 10 100 1000 10000
1 2 20 200 2000 20000
df.truncate(before='B', after='D', axis=1)
出力:
B C D
0 10 100 1000
1 20 200 2000