1866

DataFrameの列を削除するときは、次を使用します。

del df['column_name']

そして、これはうまく機能します。なぜ以下が使えないのですか?

del df.column_name

として列/シリーズにアクセスできるので、これが機能することdf.column_nameを期待していました。

4

19 に答える 19

2963

Pandas でこれを行う最善の方法は、次を使用することdropです。

df = df.drop('column_name', 1)

番号です (1行と列の場合)。01

再割り当てせずに列を削除するには、次のように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'])
于 2013-08-09T11:12:09.200 に答える
1230

ご想像のとおり、正しい構文は次のとおりです。

del df['column_name']

del df.column_namePython の構文上の制限の結果として、単純に機能させるのは困難です。Python によってカバーの下del df[name]に変換されます。df.__delitem__(name)

于 2012-11-21T03:12:31.480 に答える
296

使用する:

columns = ['Col1', 'Col2', ...]
df.drop(columns, inplace=True, axis=1)

これにより、1 つまたは複数の列がインプレースで削除されます。inplace=Truepandas v0.13 で追加されたもので、古いバージョンでは動作しないことに注意してください。その場合、結果を代入する必要があります。

df = df.drop(columns, axis=1)
于 2014-03-23T20:57:57.500 に答える
147

インデックスでドロップ

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
于 2015-07-15T13:37:23.217 に答える
89

ここでのほとんどの回答で見落とされている実際の質問は次のとおりです。

なぜ使えないの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」列を削除する必要があるかのように、メソッドが混乱します。

この問題の背後にあるアーキテクチャの問題

  1. データフレームは列のコレクションですか?
  2. データフレームは行のコレクションですか?
  3. 列はデータフレームの属性ですか?

パンダの答え:

  1. はい、あらゆる点で
  2. .ixいいえ。ただし、必要に応じて、.locまたは.ilocメソッドを使用できます。
  3. たぶん、データを読みたいですか?はい、属性の名前がデータフレームに属する別の属性によって既に使用されていない限り。データを変更しますか? それからいいえ

TLDR;

Pandas には、この種の認知的不協和がユーザーに発生しないdel df.column_nameように再検討する必要がある非常に乱暴に成長したアーキテクチャがあるため、できません。

プロのヒント:

df.column_name を使用しないでください。きれいかもしれませんが、認知的不協和を引き起こします。

ここに収まる Python の禅の引用:

列を削除するには、複数の方法があります。

それを行う明白な方法が 1 つ (できれば 1 つだけ) ある必要があります。

列は属性の場合もありますが、そうでない場合もあります。

特別なケースは、ルールを破るほど特別なものではありません。

dtypesdel df.dtypes属性または dtypes 列を削除しますか?

あいまいさに直面しても、推測する誘惑を断ってください。

于 2016-05-03T09:48:51.933 に答える
70

優れた追加機能は、列が存在する場合にのみ列を削除できることです。このようにして、より多くのユースケースをカバーでき、渡されたラベルから既存の列のみを削除します。

たとえば、単にerrors='ignore'を追加します。

df.drop(['col_name_1', 'col_name_2', ..., 'col_name_N'], inplace=True, axis=1, errors='ignore')
  • これは pandas 0.16.1 以降の新機能です。ドキュメントはこちらです。
于 2016-01-03T12:29:49.343 に答える
38

常に[]表記を使用することをお勧めします。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
于 2012-11-16T11:33:47.677 に答える
25

使用する:

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)
于 2020-10-15T17:14:33.977 に答える
4

不要な値を含む典型的な列名がある場合に、とのiloc関数を使用して列を削除します。dataframeslicing

df = df.iloc[:,1:] # Removing an unnamed index column

これ0がデフォルトの行で1あり、最初の列であるため:,1:、最初の列を削除するためのパラメーターです。

于 2020-11-15T01:19:34.953 に答える
3

ドット構文は JavaScript では機能しますが、Python では機能しません。

  • パイソン:del df['column_name']
  • JavaScript:del df['column_name'] または del df.column_name
于 2016-04-20T15:55:38.017 に答える
0

特定の列の前後の列を削除するには、メソッド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
于 2021-10-06T07:31:21.473 に答える