pandas根据列名删除列

时间:2017-03-19 15:39:34

标签: python pandas

所有

让我们说有一些带有一些列名的df - 在我的例子中,名称是数值。例如,名为1000,1001等的列。我需要删除所有没有通过某个过滤器测试的列 - 在我的例子中,所有列的名称都小于某个值。可以说不到1500 ......

我知道如何直接执行此操作(通过列出每一列),或者通过调用循环中的drop,但它似乎非常低效。我在表达它时遇到语法困难..

我尝试过这样的事情:

df.drop(df.columns[x for x in df.columns.values<str(1500)], axis=1))

df.drop(df.columns.values<str(1500)], axis=1)

但这些显然是错误的。

请指教! 谢谢

3 个答案:

答案 0 :(得分:2)

考虑列名为0到99的数据框。

    0   1   2   3   4   5   6   7   8   9   ... 90  91  92  93  94  95  96  97  98  99
0   0   0   0   0   0   0   0   0   0   0   ... 0   0   0   0   0   0   0   0   0   0

如果要删除列名少于30,

df = df.drop((x for x in df.columns.tolist() if x < 30), axis = 1)

返回

    30  31  32  33  34  35  36  37  38  39  ... 90  91  92  93  94  95  96  97  98  99
0   0   0   0   0   0   0   0   0   0   0   ... 0   0   0   0   0   0   0   0   0   0

如果您的列属于对象类型,请先使用

进行转换
df.columns = df.columns.astype(np.int64)

答案 1 :(得分:2)

我认为最简单的是创建boolean mask然后选择loc:

df = pd.DataFrame(columns=range(10), index=[0]);
print (df)
     0    1    2    3    4    5    6    7    8    9
0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN

#inverting boolean mask with ~
print (df.loc[:, ~(df.columns < 8)])
     8    9
0  NaN  NaN

print (df.columns >= 8)
[False False False False False False False False  True  True]

print (df.loc[:, df.columns >= 8])
     8    9
0  NaN  NaN

过滤后的列名与drop的内容相同:

print (df.columns[df.columns < 8])
Int64Index([0, 1, 2, 3, 4, 5, 6, 7], dtype='int64')


print (df.drop(df.columns[df.columns < 8], axis=1))

     8    9
0  NaN  NaN

答案 2 :(得分:0)

首先构建一个要删除的cols列表(循环遍历列,查看它们是否符合条件),然后立即从该列表中删除所有cols。