繁体   English   中英

熊猫根据列名删除列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM