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

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之外的所有列?


当前回答

不要使用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。下降(b,原地= True)。

df.drop()也接受一个标签列表,例如df.drop。Drop (['a', 'b'], axis=1)删除列a和列b。

其他回答

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

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

or

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

这里有另一种方法:

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

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

你可以在索引中删除列:

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

or

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

我认为一个很好的解决方案是使用pandas和regex的函数过滤器(匹配除“b”之外的所有内容):

df.filter(regex="^(?!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)