[英]pandas dropping columns based on column name
全部
假设有一个带有一些列名的 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)
但这些显然是错误的。
请指教! 谢谢
我认为最简单的是创建布尔掩码,然后使用 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
考虑一个列名从 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)
首先构建要删除的列列表(遍历列,查看它们是否符合条件),然后立即删除该列表中的所有列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.