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


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中删除一列与创建一个新的DataFrame与包含另一列的所有列之间的区别。
RM

@RM很抱歉,但是我不同意您对该帖子标题所做的编辑,因此我将其回退了。的确,OP的意图是质疑语法,但该帖子已发展为解决如何删除列的更广泛的问题。这篇文章中的答案是那里最高被推荐帖子的复本。骗子留下来。
cs95,19年

请注意,正在Meta上讨论此问题。
异端猴

Answers:


421

当列不是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它非常易读并且可以用于复杂索引。
Marius

1
谢谢您的出色回答。如果没有标题怎么办?我如何喝水?
FabioSpaghetti

1
如果您有超过1列要忽略,该怎么办?
Bruno Ambrozio

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)将drop column ab


1
也可以像您期望的那样在多索引上工作。 df.drop([('l1name', 'l2name'), 'anotherl1name'], axis=1)。似乎使用列表vs元组来确定是要多个列(列表)还是要引用多索引(元组)。
travc

16
更具可读性:df.drop(columns='a')df.drop(columns=['a', 'b'])。也可以替换columns=index=
BallpointBen

但是,如果您碰巧知道要删除的所有列的名称,则此功能将无用。
yeliabsalohcin

由于这将创建副本而不是视图/引用,因此您无法通过在作业的LHS上使用它来修改原始数据框。
Jan Christoph Terasa

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

3
@NischalHp df.drop也可以省略多列df.drop(['a','b'],axis = 1)
Patrick Li

2
我认为值得注意的是,这可以重新安排您的专栏
ocean800 '19

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提到的方法。并不是说其他​​人是错的。

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

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

然后,您可以x_colsx_cols1其他计算一样将那些变量中的列集合放入另一个变量中。

ex: x_cols1 = data[x_cols]

您能解释为什么这是一个单独的答案,而不是对萨尔瓦多答案的注释/扩展吗?

3

这是一行lambda:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.