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

时间:2016-09-02 18:03:32

标签: python pandas nan

如果我的问题已经得到解答,请接受我的道歉。我试图找到一个解决方案,但我能找到的只是在数据帧中为所有NaN提供解决方案。 我的问题是我有一个包含6列和500行的数据帧。我需要检查在任何特定行中是否所有值都是NaN,以便我可以从我的数据集中删除它们。第2行,第6行和第2行的示例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

请注意,最上面一行只是标题,而第二行是我的数据开始。如果有人能帮助我朝正确的方向解决这个难题,将不胜感激。

另外我的第二个问题是,如果我想删除缺少4或5列数据的行,那么在删除所有列中的所有Nan之后,那将是最佳解决方案。

最后一个问题是,在删除大多数Nan的行之后是否可能,那么如何在其余的450行上创建箱形图?

任何回复都将受到高度赞赏。

此致

2 个答案:

答案 0 :(得分:4)

  

我需要检查在任何特定行中是否所有值都是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

答案 1 :(得分:4)

对于那些搜索,因为希望知道问题标题:

  

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

enter image description here

检查所有列是否为NaN:

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

enter image description here

要检查列的名称,“评级”是否为NaN:

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

enter image description here