基于列名称删除pandas数据框中的列

4

全部

假设有一个包含一些列名的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个回答

7

我认为最简单的方法是创建布尔掩码,然后使用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

3

考虑一个列名为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)

0

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


我可以这样做,但我想知道是否有内联选项。类似这样:df.drop(df.columns[x for x in range(1000,1499)], axis=1) - elanamig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接