所有
让我们说有一些带有一些列名的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)
但这些显然是错误的。
请指教! 谢谢
答案 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)