Python Pandas:检查行中的所有列是否为NaN值

12

如果我的问题已经得到了答复,请接受我的道歉。我试图找到解决方案,但是所有我能找到的都是针对数据帧中所有NaN值的dropna解决方案。 我的问题是,我有一个包含6列和500行的数据帧。我需要检查是否在任何一行中所有的值都是NaN,以便我可以将它们从我的数据集中删除。例如,下面的第2、6和7行从col1到col6都包含所有NaN:

    Col1    Col2    Col3    Col4    Col5    Col6
    12      25      02      78      88      90
    Nan     Nan     Nan     Nan     Nan     Nan
    Nan     35      03      11      65      53
    Nan     Nan     Nan     Nan     22      21
    Nan     15      93      111     165     153
    Nan     Nan     Nan     Nan     Nan     Nan
    Nan     Nan     Nan     Nan     Nan     Nan
    141     121     Nan     Nan     Nan     Nan

请注意,顶部一行只是标题,从第二行开始我的数据才开始。如果有人能帮我指出解决这个谜题的正确方向,我将不胜感激。
另外,我的第二个问题是,在删除所有列中的NaN后,如果我想删除4或5列数据缺失的行,最好的解决方案是什么?
最后一个问题是,如果删除了大多数NaN的行,那么如何在剩余的450行上创建箱线图?
非常感谢您的回复。
敬礼,
3个回答

14

对于那些因想要了解问题标题而进行搜索的人:

检查所有行中的列值是否为NaN

一个简单的方法是:

df[[list_of_cols_to_check]].isnull().apply(lambda x: all(x), axis=1) 

import pandas as pd
import numpy as np


df = pd.DataFrame({'movie': [np.nan, 'thg', 'mol', 'mol', 'lob', 'lob'],
                  'rating': [np.nan, 4., 5., np.nan, np.nan, np.nan],
                  'name':   ['John', np.nan, 'N/A', 'Graham', np.nan, np.nan]}) 
df.head()

检查所有列是否为 NaN:


enter image description here

cols_to_check = df.columns
df['is_na'] = df[cols_to_check].isnull().apply(lambda x: all(x), axis=1) 
df.head() 

检查'名称'和'评分'列是否为NaN:


输入图像描述

cols_to_check = ['name', 'rating']
df['is_na'] = df[cols_to_check].isnull().apply(lambda x: all(x), axis=1) 
df.head()  

输入图像描述


3
你可以避免使用.apply,因为df[cols_to_check].isnull().any(1)的效果完全相同。在一个有200万行数据且有3个需要检查的列的数据框中,使用apply版本需要25.4秒,而使用any只需要106毫秒。 - rpanai

10
我需要检查特定行是否所有的值都为NaN,以便从我的数据集中删除它们。这正是 pd.DataFrame.dropna(how='all') 所做的:
In [3]: df = pd.DataFrame({'a': [None, 1, None], 'b': [None, 1, 2]})

In [4]: df
Out[4]: 
     a    b
0  NaN  NaN
1  1.0  1.0
2  NaN  2.0

In [5]: df.dropna(how='all')
Out[5]: 
     a    b
1  1.0  1.0
2  NaN  2.0

关于您的第二个问题,pd.DataFrame.boxplot 可以实现该功能。如果需要,您可以使用 column 参数指定所需的列。请参阅文档中的示例


嗨Ami, 谢谢回复。实际上,目前我有6列和450行。 - Baig
@Baig 哦,你说得对 - 我删掉了那条评论(反正它也不是很重要)。 - Ami Tavory
1
第二个问题实际上是如何删除缺少4或5列数据的行,因此解决第一个和第二个问题的另一种方法是执行df.dropna(thresh=2)以摆脱所有至少没有2个非NaN值的列。 - Mr.F
@Baig 如果您将那部分写成答案,我会很高兴地点赞它 :-) - Ami Tavory
从另一个数据集中删除它们如何?然后 dropna() 无法帮助... - jtlz2

2
检查行值中所有列是否为NaN。
    #This gives you a boolean output if the df contains any row with all NaN values
    df.isnull().values.all()

@Ami给出的答案仍然适用。在处理派生值时,这个检查非常有用,在删除之前,如果有必要,你可能需要重新评估特征提取逻辑。

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