【问题标题】:Display rows with one or more NaN values in pandas dataframe在 pandas 数据框中显示具有一个或多个 NaN 值的行
【发布时间】:2017-09-11 11:03:43
【问题描述】:

我有一个数据框,其中一些行包含缺失值。

In [31]: df.head()
Out[31]: 
                             alpha1  alpha2    gamma1    gamma2       chi2min  
filename                                                                        
M66_MI_NSRh35d32kpoints.dat  0.8016  0.9283  1.000000  0.074804  3.985599e+01   
F71_sMI_DMRI51d.dat          0.0000  0.0000       NaN  0.000000  1.000000e+25   
F62_sMI_St22d7.dat           1.7210  3.8330  0.237480  0.150000  1.091832e+01   
F41_Car_HOC498d.dat          1.1670  2.8090  0.364190  0.300000  7.966335e+00   
F78_MI_547d.dat              1.8970  5.4590  0.095319  0.100000  2.593468e+01 

我想在屏幕上显示这些行。如果我尝试df.isnull(),它会给出一个带有TrueFalse 的长数据框。有什么方法可以选择这些行并将它们打印在屏幕上?

【问题讨论】:

    标签: python pandas dataframe nan


    【解决方案1】:

    您可以使用DataFrame.any 和参数axis=1DataFrame.isnaboolean indexing 的行中检查至少一个True

    df1 = df[df.isna().any(axis=1)]
    

    d = {'filename': ['M66_MI_NSRh35d32kpoints.dat', 'F71_sMI_DMRI51d.dat', 'F62_sMI_St22d7.dat', 'F41_Car_HOC498d.dat', 'F78_MI_547d.dat'], 'alpha1': [0.8016, 0.0, 1.721, 1.167, 1.897], 'alpha2': [0.9283, 0.0, 3.833, 2.809, 5.459], 'gamma1': [1.0, np.nan, 0.23748000000000002, 0.36419, 0.095319], 'gamma2': [0.074804, 0.0, 0.15, 0.3, np.nan], 'chi2min': [39.855990000000006, 1e+25, 10.91832, 7.966335000000001, 25.93468]}
    df = pd.DataFrame(d).set_index('filename')
    

    print (df)
                                 alpha1  alpha2    gamma1    gamma2       chi2min
    filename                                                                     
    M66_MI_NSRh35d32kpoints.dat  0.8016  0.9283  1.000000  0.074804  3.985599e+01
    F71_sMI_DMRI51d.dat          0.0000  0.0000       NaN  0.000000  1.000000e+25
    F62_sMI_St22d7.dat           1.7210  3.8330  0.237480  0.150000  1.091832e+01
    F41_Car_HOC498d.dat          1.1670  2.8090  0.364190  0.300000  7.966335e+00
    F78_MI_547d.dat              1.8970  5.4590  0.095319       NaN  2.593468e+01
    

    解释

    print (df.isna())
                                alpha1 alpha2 gamma1 gamma2 chi2min
    filename                                                       
    M66_MI_NSRh35d32kpoints.dat  False  False  False  False   False
    F71_sMI_DMRI51d.dat          False  False   True  False   False
    F62_sMI_St22d7.dat           False  False  False  False   False
    F41_Car_HOC498d.dat          False  False  False  False   False
    F78_MI_547d.dat              False  False  False   True   False
    
    print (df.isna().any(axis=1))
    filename
    M66_MI_NSRh35d32kpoints.dat    False
    F71_sMI_DMRI51d.dat             True
    F62_sMI_St22d7.dat             False
    F41_Car_HOC498d.dat            False
    F78_MI_547d.dat                 True
    dtype: bool
    
    df1 = df[df.isna().any(axis=1)]
    print (df1)
                         alpha1  alpha2    gamma1  gamma2       chi2min
    filename                                                           
    F71_sMI_DMRI51d.dat   0.000   0.000       NaN     0.0  1.000000e+25
    F78_MI_547d.dat       1.897   5.459  0.095319     NaN  2.593468e+01
    

    【讨论】:

    • axis : {0 or ‘index’, 1 or ‘columns’}, or tuple/list its pass tuple or list to drop on multiple axes
    • 假设您只想将isnull() 应用于某些列?
    • df[df['gamma1','gamma2'].isna().any(axis=1)] 或者对于一列它是 df[df['gamma1'].isna() ]。无论我们是检查整个数据帧还是少数列中的空值,这个想法都是相同的。应用用于布尔索引的 isna() 后,我们得到布尔系列。
    • 重要提示:如果您尝试访问具有 NaN 值的行(并且 想要访问包含空值但不包含空值的行NaNs),这不起作用 - isna() 将检索两者。当您的数据框由数字和其他对象类型(例如字符串)组成时,这一点尤其适用。
    【解决方案2】:

    对于 python 3.6 或更高版本,请使用 df[df.isnull().any(axis=1)]

    【讨论】:

      【解决方案3】:

      假设 gamma1 和 gamma2 是 df.isnull().any() 给出 True 值的两个这样的列,可以使用以下代码打印行.

      bool1 = pd.isnull(df['gamma1'])
      bool2 = pd.isnull(df['gamma2'])
      df[bool1]
      df[bool2]
      

      【讨论】:

        【解决方案4】:

        df.isna().any() 返回 nan 值的列状态。因此,观察和分析 nan 值的更好方法是:

        df.loc[:, df.isna().any()]

        example

        【讨论】:

          【解决方案5】:

          也可以试试这个,和之前的答案差不多。

              d = {'filename': ['M66_MI_NSRh35d32kpoints.dat', 'F71_sMI_DMRI51d.dat', 'F62_sMI_St22d7.dat', 'F41_Car_HOC498d.dat', 'F78_MI_547d.dat'], 'alpha1': [0.8016, 0.0, 1.721, 1.167, 1.897], 'alpha2': [0.9283, 0.0, 3.833, 2.809, 5.459], 'gamma1': [1.0, np.nan, 0.23748000000000002, 0.36419, 0.095319], 'gamma2': [0.074804, 0.0, 0.15, 0.3, np.nan], 'chi2min': [39.855990000000006, 1e+25, 10.91832, 7.966335000000001, 25.93468]}
              df = pd.DataFrame(d).set_index('filename')
          

          每列中的空值计数。

          df.isnull().sum()
          

          df.isnull().any(axis=1)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-14
            • 2014-12-02
            • 2019-10-24
            • 2018-05-21
            • 1970-01-01
            相关资源
            最近更新 更多