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

use*_*260 0 python apply pandas

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

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

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

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

Psi*_*dom 5

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

df.eq("?").sum()
Run Code Online (Sandbox Code Playgroud)

给出?每列中的数量:

df.eq("?").sum().gt(1800)
Run Code Online (Sandbox Code Playgroud)

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

df.loc[:,~df.eq("?").sum().gt(1800)]
Run Code Online (Sandbox Code Playgroud)

要使用drop方法,您需要确保传入的是标签或列名列表而不是布尔系列,并且还要删除列,您需要将axis参数指定为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
Run Code Online (Sandbox Code Playgroud)