将列拖放到特定字符的特定值计数之下

时间:2017-07-17 02:09:29

标签: python pandas apply

某些数据帧列df的元素等于“?”字符。 df有2000行。我想删除超过1800个元素等于“?”的列。

我认为我需要使用apply方法来确定需要删除哪些列,然后使用drop方法删除它们但我无法弄清楚如何。

df.drop(df.apply(lambda x: x.value_counts()["?"]>1800 ,axis=0))

但显然它不起作用。以上这行不是我尝试过的第一件事。我也尝试了很多其他的东西,但它们都给了我不同的错误。我感谢任何帮助。

1 个答案:

答案 0 :(得分:5)

您不一定要使用apply方法和value_counts;检查相等性和总和可以在这里做同样的事情,并且可能更有效:

df.eq("?").sum()

给出每列?的数量:

df.eq("?").sum().gt(1800)

给出一个布尔系列,其中如果列有超过1800个问号,则将其标记为True,这可以进一步用于使用loc对数据框进行子集化;所以放在一起:

df.loc[:,~df.eq("?").sum().gt(1800)]

要使用drop方法,您需要确保传入的内容是标签或列名列表而不是布尔序列,还要删除列,您需要将轴参数指定为1,所以要使你原来的答案有效:

df.drop(df.apply(lambda x: x.value_counts()["?"]>1800)[lambda x: x].index, axis=1)
#                                                     ^^^^^^^^^^^^^
# here use a lambda filter to extract column names that need to be dropped