パンダの1列を除くすべての列を選択するにはどうすればよいですか?


278

私はこのようなデータフレームを持っています:

import pandas
import numpy as np
df = DataFrame(np.random.rand(4,4), columns = list('abcd'))
df
      a         b         c         d
0  0.418762  0.042369  0.869203  0.972314
1  0.991058  0.510228  0.594784  0.534366
2  0.407472  0.259811  0.396664  0.894202
3  0.726168  0.139531  0.324932  0.906575

を除くすべての列を取得するにはどうすればよいcolumn bですか?


@ cs95-現在リストされている重複ターゲットは重複ではありません。元のタイトルにもかかわらず、リンクされた質問は「この特定の構文が機能しない理由」ですが、この質問はより一般的な「これを行うための最良の方法は何か」です。-これに、既存のDataFrameから列を削除する場合と、別の列を1つだけ残して新しいDataFrameを作成する場合の違いを追加します。
RM

@RM申し訳ありませんが、その投稿のタイトルに加えた編集内容に同意できないため、ロールバックしました。OPの意図が構文を疑問視することであったことは事実ですが、この投稿は、列を削除する方法に関するより広範な疑問に対処するようになりました。この投稿の答えは、そこにある最高投票数のカーボンコピーです。だまされたままです。
cs95

この質問はMetaで議論されていることに注意してください。
異端者の猿

回答:


422

列がMultiIndexでdf.columnsはない場合、は列名の配列にすぎないため、次のことができます。

df.loc[:, df.columns != 'b']

          a         c         d
0  0.561196  0.013768  0.772827
1  0.882641  0.615396  0.075381
2  0.368824  0.651378  0.397203
3  0.788730  0.568099  0.869127

13
悪くはありませんが、@ mikeのソリューションを使用したdrop方がIMOが優れています。もう少し読みやすく、
マルチインデックス

5
私は実際に@mikeのソリューションを使用するdrop方が優れていることに同意します-(単一レベルの)列は操作できる配列ですが、特に列を削除する場合dropは非常に読みやすく、複雑なインデックスでうまく機能することを知っておくと便利です。
マリウス

1
この素晴らしい答えをありがとう。ヘッダーがない場合はどうなりますか?どのように私はアドレッシングですか?
FabioSpaghetti、

1
無視する列が複数ある場合はどうでしょうか?
Bruno Ambrozio

@Mariusこれは複数の列(たとえば2つ)でも機能しますか?
MasayoMusic

227

使用しないでくださいix。それはだ非推奨します。これを行う最も読みやすく慣用的な方法はdf.drop()次のとおりです。

>>> df

          a         b         c         d
0  0.175127  0.191051  0.382122  0.869242
1  0.414376  0.300502  0.554819  0.497524
2  0.142878  0.406830  0.314240  0.093132
3  0.337368  0.851783  0.933441  0.949598

>>> df.drop('b', axis=1)

          a         c         d
0  0.175127  0.382122  0.869242
1  0.414376  0.554819  0.497524
2  0.142878  0.314240  0.093132
3  0.337368  0.933441  0.949598

デフォルトで.drop()は、その場で動作しないことに注意してください。不吉な名前にもかかわらず、dfこのプロセスによって無害です。から完全に削除する場合bdf、から削除してくださいdf.drop('b', inplace=True)

df.drop()ラベルのリストも受け入れdf.drop(['a', 'b'], axis=1)ます。たとえば、列aとをドロップしますb


1
また、期待どおりにマルチインデックスでも機能します。 df.drop([('l1name', 'l2name'), 'anotherl1name'], axis=1)。複数の列が必要か(リスト)、マルチインデックスを参照するか(タプル)を決定するには、リストとタプルを使用しているようです。
travc 2017年

16
より読みやすい:df.drop(columns='a')またはdf.drop(columns=['a', 'b'])。また、交換することができますcolumns=index=
BallpointBen 2018年

ただし、ドロップするすべての列の名前がわからない場合は、これは役に立ちません。
yeliabsalohcin 2018

これはビュー/参照ではなくコピーを作成するため、割り当てのLHSでこれを使用して元のデータフレームを変更することはできません。
Jan Christoph Terasa

@JanChristophTerasa元のdf内でこれらの選択された列を変更する方法を知っていますか(これらすべての列に別の列の値を乗算するなど)。これらの値を変更する場合、ドロップされた列を最後に追加する必要がありますが、これは最善の方法ではないようです。
MasayoMusic

132
df[df.columns.difference(['b'])]

Out: 
          a         c         d
0  0.427809  0.459807  0.333869
1  0.678031  0.668346  0.645951
2  0.996573  0.673730  0.314911
3  0.786942  0.719665  0.330833

9
このアプローチは、複数の列を省略するために使用できるため、気に入っています。
Nischal Hp 2017

3
@NischalHp df.dropは、複数の列df.drop(['a'、 'b']、axis = 1)を省略することもできます
Patrick Li

2
これは列を再配置できることに注意する価値があると思います
ocean800

1
@ ocean800はい、そうです。sort=Falseその動作を避けたい場合は合格できます(df.columns.difference(['b'], sort=False)
ayhan

64

使用できます df.columns.isin()

df.loc[:, ~df.columns.isin(['b'])]

複数の列を削除する場合は、次のように簡単です。

df.loc[:, ~df.columns.isin(['col1', 'col2'])]

12

ここに別の方法があります:

df[[i for i in list(df.columns) if i != '<your column>']]

表示したくない列を除いて、表示するすべての列を渡すだけです。


5

@Salvador Daliを少し変更すると、列のリストで除外できます。

df[[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]

または

df.loc[:,[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]

4

最善の方法は、@ Salvador Daliが述べた方法だと思います。他の人が間違っているというわけではありません。

なぜなら、1つの列を選択してそれを1つの変数に入れ、残りの列を別の列に入れて、比較や計算を行うためのデータセットがあるからです。次に、データセットの列を削除しても役に立たない場合があります。もちろん、そのためのユースケースもあります。

x_cols = [x for x in data.columns if x != 'name of column to be excluded']

次に、他の計算とx_cols同様にx_cols1、これらの列のコレクションを変数内の別の変数に配置できます。

ex: x_cols1 = data[x_cols]

これが、サルバドールの回答に対するコメント/拡張ではなく、別の回答である理由を説明できますか?

3

以下は1行のラムダです。

df[map(lambda x :x not in ['b'], list(df.columns))]

以前

import pandas
import numpy as np
df = pd.DataFrame(np.random.rand(4,4), columns = list('abcd'))
df

       a           b           c           d
0   0.774951    0.079351    0.118437    0.735799
1   0.615547    0.203062    0.437672    0.912781
2   0.804140    0.708514    0.156943    0.104416
3   0.226051    0.641862    0.739839    0.434230

df[map(lambda x :x not in ['b'], list(df.columns))]

        a          c          d
0   0.774951    0.118437    0.735799
1   0.615547    0.437672    0.912781
2   0.804140    0.156943    0.104416
3   0.226051    0.739839    0.434230
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.