【问题标题】:Python Pandas: Check if all columns in rows value is NaNPython Pandas:检查行值中的所有列是否为 NaN
【发布时间】:2017-01-10 22:08:25
【问题描述】:

如果我的问题已经得到解答,请接受我的歉意。我试图找到一个解决方案,但我能找到的只是为数据框中所有 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 行?

我们将不胜感激。

问候,

【问题讨论】:

    标签: python pandas nan


    【解决方案1】:

    我需要检查任何特定行中的所有值是否都是 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 参数指定所需的列(如果需要)。另见the example in the docs。

    【讨论】:

    • 嗨,阿米,感谢您的回复。实际上目前我有 6 列和 450 行。
    • @Baig 哦,对了,你是 - 删除了该评论(无论如何它并不那么重要)。
    • 第二个问题实际上是如何删除缺少数据的 4 或 5 列的行,因此解决第一个和第二个问题的另一种方法是使用 df.dropna(thresh=2) 删除所有不包含的列'至少有 2 个非 NaN 值
    • @Baig 如果你把那部分写成答案,我会很高兴地支持它:-)
    【解决方案2】:

    对于那些想知道问题标题的搜索:

    检查行中所有列的值是否为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:

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


    检查列'name'、'rating'是否为NaN:

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

    【讨论】:

    • 你可以避免.apply 因为df[cols_to_check].isnull().any(1) 正在做同样的事情。在具有 3 个 cols_to_check 的 2M 行数据帧上,apply 版本需要 25.4 秒,而使用 any 你只需要 106 毫秒。
    猜你喜欢
    • 2016-01-13
    • 2016-12-17
    • 2021-10-29
    • 2015-03-01
    • 2015-06-14
    • 2020-07-28
    • 2020-06-25
    相关资源
    最近更新 更多