某些数据帧列df的元素等于“?”字符。 df有2000行。我想删除超过1800个元素等于“?”的列。
我认为我需要使用apply方法来确定需要删除哪些列,然后使用drop方法删除它们但我无法弄清楚如何。
df.drop(df.apply(lambda x: x.value_counts()["?"]>1800 ,axis=0))
但显然它不起作用。以上这行不是我尝试过的第一件事。我也尝试了很多其他的东西,但它们都给了我不同的错误。我感谢任何帮助。
答案 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