如何选择除pandas中的一列以外的所有列?

mar*_*ain 214 python pandas

我的数据框看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

除了以外我怎么能得到所有列column b

Mar*_*ius 324

当您没有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
Run Code Online (Sandbox Code Playgroud)

  • 不错,但是@mike使用`drop`的解决方案是更好的IMO.更具可读性并处理多索引 (10认同)
  • 我实际上同意@mike使用`drop`的解决方案更好-我确实发现发现(单级)列是可以使用的数组很有用,但是特别是对于删除列,`drop`可读性强并且可以工作与复杂的索引。 (3认同)
  • 当您有超过 1 列需要忽略时该怎么办? (3认同)

Mik*_*ike 189

不要用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
Run Code Online (Sandbox Code Playgroud)

请注意,默认情况下,.drop()不会在原地运行; 尽管名字不祥,但df这个过程并没有受到伤害.如果你想永久删除bdf,做的df.drop('b', inplace=True).

df.drop()也接受标签列表,例如df.drop(['a', 'b'], axis=1)将删除列ab.

  • 更具可读性:`df.drop(columns ='a')`或`df.drop(columns = ['a','b'])`.也可以用`index =`替换`columns =`. (13认同)
  • 由于这会创建副本而不是视图/引用,因此您无法通过在分配的 LHS 上使用它来修改原始数据框。 (3认同)
  • 也适用于多重索引,就像您期望的那样。`df.drop([('l1name', 'l2name'), 'anotherl1name'], axis=1)`. 似乎使用列表与元组来确定您是否需要多个列(列表)或引用多重索引(元组)。 (2认同)

ayh*_*han 112

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
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这种方法,因为它可以用来省略多个列. (7认同)
  • @ocean800 是的,确实如此。如果你想避免这种行为,你可以传递 `sort=False` (`df.columns.difference(['b'], sort=False)`) (5认同)
  • 我认为值得注意的是,这可以重新排列您的列 (4认同)
  • @NischalHp df.drop也可以省略多列df.drop(['a','b'],axis = 1) (2认同)

Tom*_*Tom 45

您可以使用 df.columns.isin()

df.loc[:, ~df.columns.isin(['b'])]
Run Code Online (Sandbox Code Playgroud)

如果要删除多个列,只需:

df.loc[:, ~df.columns.isin(['col1', 'col2'])]
Run Code Online (Sandbox Code Playgroud)


Myk*_*tko 16

您可以drop在索引列:

df[df.columns.drop('b')]
Run Code Online (Sandbox Code Playgroud)

输出:

          a         c         d
0  0.418762  0.869203  0.972314
1  0.991058  0.594784  0.534366
2  0.407472  0.396664  0.894202
3  0.726168  0.324932  0.906575
Run Code Online (Sandbox Code Playgroud)


Sal*_*ali 11

这是另一种方式:

df[[i for i in list(df.columns) if i != '<your column>']]
Run Code Online (Sandbox Code Playgroud)

您只需传递要显示的所有列,除了您不想要的列.


Gra*_*non 7

这是一个单行 lambda:

df[map(lambda x :x not in ['b'], list(df.columns))]
Run Code Online (Sandbox Code Playgroud)

之前

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
Run Code Online (Sandbox Code Playgroud)

之后

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
Run Code Online (Sandbox Code Playgroud)


小智 6

我认为最好的方法是@Salvador Dali 提到的方法。并不是说其他​​人错了。

因为当您有一个数据集时,您只想选择一列并将其放入一个变量中,并将其余的列放入另一个变量中以进行比较或计算。然后删除数据集的列可能无济于事。当然,也有一些用例。

x_cols = [x for x in data.columns if x != 'name of column to be excluded']
Run Code Online (Sandbox Code Playgroud)

然后,您可以将变量中的这些列集合x_cols放入另一个变量中,例如x_cols1用于其他计算。

ex: x_cols1 = data[x_cols]
Run Code Online (Sandbox Code Playgroud)


use*_*097 5

对@Salvador Dali的另一项轻微修改使列列表可以排除:

df[[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]
Run Code Online (Sandbox Code Playgroud)

要么

df.loc[:,[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]
Run Code Online (Sandbox Code Playgroud)