【问题标题】:How to count nan values in a pandas DataFrame?如何计算 pandas DataFrame 中的 nan 值?
【发布时间】:2016-04-04 20:55:53
【问题描述】:

在 pandas DataFrame 中计算(不是数字)nan 值的最佳方法是什么?

以下代码:

import numpy as np
import pandas as pd
dfd = pd.DataFrame([1, np.nan, 3, 3, 3, np.nan], columns=['a'])
dfv = dfd.a.value_counts().sort_index()
print("nan: %d" % dfv[np.nan].sum())
print("1: %d" % dfv[1].sum())
print("3: %d" % dfv[3].sum())
print("total: %d" % dfv[:].sum())

输出:

nan: 0
1: 1
3: 3
total: 4

而期望的输出是:

nan: 2
1: 1
3: 3
total: 6

我在 Python 3.5.0 和 Anaconda 2.4.0 中使用 pandas 0.17。

【问题讨论】:

    标签: python python-3.x pandas dataframe nan


    【解决方案1】:

    只计算空值,你可以使用isnull()

    In [11]:
    dfd.isnull().sum()
    
    Out[11]:
    a    2
    dtype: int64
    

    这里a是列名,该列中出现了2次空值。

    【讨论】:

    • 这是更简单的方法
    【解决方案2】:

    如果您只想计算 DataFrame df 的列 'a' 中的 NaN 值,请使用:

    len(df) - df['a'].count()
    

    这里count() 告诉我们非NaN 值的数量,这是从值的总数中减去的(由len(df) 给出)。

    要计算df每个 列中的 NaN 值,请使用:

    len(df) - df.count()
    

    如果你想使用value_counts,告诉它不要通过设置dropna=False(在0.14.1中添加)删除NaN值:

    dfv = dfd['a'].value_counts(dropna=False)
    

    这也允许计算列中的缺失值:

     3     3
    NaN    2
     1     1
    Name: a, dtype: int64
    

    然后,您的其余代码应该可以按预期工作(请注意,不必调用 sum;只需 print("nan: %d" % dfv[np.nan]) 就足够了)。

    【讨论】:

    • 并且使用上面的方法后 dfv.values.sum() 统计所有的值,即 6 谢谢。 ;)
    • 没问题!是的,这行得通。事实上,你可以写dfv.sum() 来计算所有的值。或者更高效,只需查看len(dfd)
    【解决方案3】:

    在数据框的所有列中计算所有 NaN 的好方法是 ...

    import pandas as pd 
    import numpy as np
    
    
    df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan]})
    print(df.isna().sum().sum())
    

    使用单个总和,您可以获得每列的 NaN 计数。第二个总和,对这些列的总和求和。

    【讨论】:

      【解决方案4】:

      如果你只想要每一列的空值的摘要,使用下面的代码 df.isnull().sum() 如果您想使用以下代码知道数据框中有多少空值 df.isnull().sum().sum() # calculate total

      【讨论】:

        【解决方案5】:

        另一种计算 所有 df 中的 nan 的方法:

        num_nans = df.size - df.count().sum()

        时间安排:

        import timeit
        
        import numpy as np
        import pandas as pd
        
        df_scale = 100000
        df = pd.DataFrame(
            [[1, np.nan, 100, 63], [2, np.nan, 101, 63], [2, 12, 102, 63],
             [2, 14, 102, 63], [2, 14, 102, 64], [1, np.nan, 200, 63]] * df_scale,
            columns=['group', 'value', 'value2', 'dummy'])
        
        repeat = 3
        numbers = 100
        
        setup = """import pandas as pd
        from __main__ import df
        """
        
        def timer(statement, _setup=None):
            print (min(
                timeit.Timer(statement, setup=_setup or setup).repeat(
                    repeat, numbers)))
        
        timer('df.size - df.count().sum()')
        timer('df.isna().sum().sum()')
        timer('df.isnull().sum().sum()')
        

        打印:

        3.998805362999999
        3.7503365439999996
        3.689461442999999
        

        差不多的

        【讨论】:

          【解决方案6】:

          这个最适合我!

          如果您想获得一个简单的摘要使用(非常适合数据科学计算缺失值及其类型):

          df.info(verbose=True, null_counts=True)
          

          或者另一个很酷的是:

          df['<column_name>'].value_counts(dropna=False)
          

          示例:

          df = pd.DataFrame({'a': [1, 2, 1, 2, np.nan],
             ...:                    'b': [2, 2, np.nan, 1, np.nan],
             ...:                    'c': [np.nan, 3, np.nan, 3, np.nan]})
          

          这是df:

              a    b    c
          0  1.0  2.0  NaN
          1  2.0  2.0  3.0
          2  1.0  NaN  NaN
          3  2.0  1.0  3.0
          4  NaN  NaN  NaN
          

          运行信息:

          df.info(verbose=True, null_counts=True)
             ...:
          <class 'pandas.core.frame.DataFrame'>
          
          RangeIndex: 5 entries, 0 to 4
          Data columns (total 3 columns):
          a    4 non-null float64
          b    3 non-null float64
          c    2 non-null float64
          dtypes: float64(3)
          

          所以你看到对于 C,你在 5 行中有 2 个非空值,b/c 你在行有空值:[0,2,4]

          这就是你对每一列使用 value_counts 得到的结果:

          In [17]: df['a'].value_counts(dropna=False)
          Out[17]:
           2.0    2
           1.0    2
          NaN     1
          Name: a, dtype: int64
          
          In [18]: df['b'].value_counts(dropna=False)
          Out[18]:
          NaN     2
           2.0    2
           1.0    1
          Name: b, dtype: int64
          
          In [19]: df['c'].value_counts(dropna=False)
          Out[19]:
          NaN     3
           3.0    2
          Name: c, dtype: int64
          

          【讨论】:

            【解决方案7】:
            dfd['a'].isnull().value_counts()
            

            返回:

            • (真695
            • 假 60,
            • 名称:a,dtype:int64)
            • True : 表示空值计数
            • False : 表示非空值计数

            【讨论】:

            • 欢迎来到 Stack Overflow。在回答已接受答案的旧问题(寻找绿色✓)以及其他答案之前,请确保您的答案添加了新内容或对它们有帮助。这是How to Answer 的指南。
            猜你喜欢
            • 2014-12-03
            • 2016-10-24
            • 2022-01-07
            • 2019-08-01
            • 2021-08-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多