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

我有一个这样的数据框架:

import pandas as pd
import numpy as np
df = pd.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

我怎么能得到所有列除了b?

688458 次浏览

当列不是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

不要使用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并没有受到这个过程的损害。如果你想永久地从df中删除b,请执行df.drop('b', inplace=True)

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

这里有另一种方法:

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

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

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

我认为最好的方法是@萨尔瓦多·达利提到的方法。并不是说其他人都错了。

因为当你有一个数据集你只想选择一列,然后把它放到一个变量中,而把其他列放到另一个变量中,以进行比较或计算。那么删除数据集的列可能没有帮助。当然也有这样的用例。

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]

对@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]]]
你可以使用df.columns.isin()

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

当你想删除多个列时,简单如下:

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

这是一行lambda:

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

< em > < / em >之前:

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

< em > < / em >后:

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

我认为一个很好的解决方案是熊猫的过滤器函数和正则表达式(匹配除"b"之外的所有东西):

df.filter(regex="^(?!b$)")

你可以在index中drop列:

df[df.columns.drop('b')]

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

类似于@Toms的回答,也可以选择所有列,除了"b"不使用.loc,像这样:

df[df.columns[~df.columns.isin(['b'])]]

我测试了速度,发现对我来说.loc解决方案是最快的

df_working_1.loc[:, df_working_1.columns != "market_id"]
# 7.19 ms ± 201 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
df_working_1.drop("market_id", axis=1)
# 7.65 ms ± 136 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
df_working_1[df_working_1.columns.difference(['market_id'])]
# 7.58 ms ± 116 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
df_working_1[[i for i in list(df_working_1.columns) if i != 'market_id']]
# 7.57 ms ± 144 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)