问题 Pandas - 删除只有NaN值的行


我有一个包含许多NaN值的DataFrame。 我想删除包含太多NaN值的行;具体来说:7个或更多。

我试过用了 dropna 有几种方式,但似乎很清楚它贪婪地删除包含的列或行 任何 NaN值。

这个问题 (按行切片Pandas DataFrame),告诉我如果我可以编译一个具有太多NaN值的行的列表,我可以用一个简单的方法删除它们

df.drop(rows)

我知道我可以使用。来计算非空值 计数 函数,我可以从总和中减去并以这种方式获得NaN计数(是否有直接计算连续NaN值的方法?)。但即便如此,我也不确定如何编写一个逐行遍历DataFrame的循环。

这是我认为正确的一些伪代码:

### LOOP FOR ADDRESSING EACH row:
    m = total - row.count()
    if (m > 7):
        df.drop(row)

我仍然是熊猫的新手,所以我对解决这个问题的其他方法非常开放;他们是更简单还是更复杂。


4442
2017-08-05 18:56


起源

有一个 thresh param指定非NA值的最小数量: pandas.pydata.org/pandas-docs/stable/generated/... 你试过这个吗? - EdChum
我没注意到,谢谢。它非常适合我的需求。 - Slavatron
df.dropna(thresh = 3)就是我所需要的(数据帧中有9列) - Slavatron
在我没有列数的情况下,我想我会在我的答案中加入一个动态的方法,很高兴我能提供帮助 - EdChum


答案:


基本上,执行此操作的方法是确定cols的数量,设置非nan值的最小数量并删除不符合此条件的行:

df.dropna(thresh=(len(df) - 7))

文档


13
2017-08-05 19:15



我不得不使用len(df.columns)而不是len(df)。工作就像一个魅力。 - thecircus
轴= 1是否告诉它丢弃列?至少在我的情况下,当我选择axis = 1时,列会被删除 - xkcd
@xkcd它取决于函数,在这种情况下它是相反的 - EdChum
axis=1 将删除列,而不是行。 “{0或'index',1或'columns'}”直接来自文档。 - Paul English
@PaulEnglish你是对的,我不确定这是否是由于历史上的文档错误或者我是否混淆了 drop 这确实颠覆了预期的意义 axis,将更新并感谢指出这一点 - EdChum


可选的thresh参数 df.dropna 允许您为其保留行的最小数量的非NA值。

df.dropna(thresh=df.shape[1]-7)

2
2017-08-05 19:14