【问题标题】:Count NaN per row with Pandas用 Pandas 计算每行的 NaN
【发布时间】:2020-12-30 09:18:39
【问题描述】:

我试图弄清楚如何在我的数据框中输出我的 First_Name 列的频率;每行。到目前为止,我成功地做到了,但我也想知道如何计算每行的 NaN 值和 Non-NaN 值。

下面是一个包含两列的数据框:First_Name 和 Favorite_Color。 我想看看我是否可以获得 First_Name 列的计数。当我输出代码时,我只能得到非 NaN 值的计数。有没有办法同时包含 NaN 值的计数并将其添加到数据框的一部分?

import pandas as pd

d = 
{
'First_Name': ["Jared", "Lily", "Sarah", "Bill", "Bill", "Alfred", None], 
'Favorite_Color': ["Blue", "Blue", "Pink", "Red", "Yellow", "Orange", "Red"]
}

df = pd.DataFrame(data=d)

df['countNames'] = df.groupby('First_Name')['First_Name'].transform('count')

print(df)

我希望得到 NaN 和非 NaN 值的计数,但我只得到了非 NaN 值的计数。

编辑:谢谢大家!

我真的很喜欢阅读每个人的答案,看到这么多不同的解决方案来解决这个问题真的很有趣!我认为 SH-SF 的答案很好,因为它更容易理解,但确实需要使用 numpy 库来回答。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    IIUC,这应该可以满足您的需求。

    nasum=df['First_Name'].isnull().sum()
    df['countNames'] = df.groupby('First_Name')['First_Name'].transform('count').replace(np.nan,nasum)
    

    或者,正如 ALollz 所建议的,下面的代码也将提供相同的结果

    df['countNames'] = df.groupby('First_Name')['First_Name'].transform('count').fillna(nasum)
    

    输入

           First_Name   Favorite_Color
    0         Jared     Blue
    1          Lily     Blue
    2         Sarah     Pink
    3          Bill     Red
    4          Bill     Yellow
    5          Alfred   Orange
    6          None     Red
    7          None     Pink
    

    输出

         First_Name     Favorite_Color  countNames
    0         Jared          Blue        1.0
    1         Lily           Blue        1.0
    2         Sarah          Pink        1.0
    3         Bill           Red         2.0
    4         Bill           Yellow      2.0
    5         Alfred         Orange      1.0
    6         None           Red         2.0
    7         None           Pink        2.0
    

    【讨论】:

    • 同样的想法;我喜欢.fillna(nasum) 的语法,因为它读起来更清楚:D。这也支持 downcast='int' 作为参数,因为它们都是整数。 +1
    • 不会df.fillna(nasum) 在所有列中用nasum 填充NA?我想避免这种情况。
    • 还添加了.fillna(nasum) 的解决方案。感谢您的建议。
    【解决方案2】:

    试试:

    df['countNames'] = df.fillna(-1).groupby('First_Name')['First_Name'].transform('count')
    
    First_Name Favorite_Color  countNames
    0      Jared           Blue           1
    1       Lily           Blue           1
    2      Sarah           Pink           1
    3       Bill            Red           2
    4       Bill         Yellow           2
    5     Alfred         Orange           1
    6       None            Red           1
    

    【讨论】:

      【解决方案3】:

      一种“快速”的解决方法是转换为字符串:

      import pandas as pd
      
      d = {
      'First_Name': ["Jared", "Lily", "Sarah", "Bill", "Bill", "Alfred", None], 
      'Favorite_Color': ["Blue", "Blue", "Pink", "Red", "Yellow", "Orange", "Red"]}
      
      df = pd.DataFrame(data=d)
      
      df['First_Name'] = df['First_Name'].astype(str)
      
      
      
      df['countNames'] = df.groupby('First_Name')['First_Name'].transform('count')
      
      print(df)
      
        First_Name Favorite_Color  countNames
      0      Jared           Blue           1
      1       Lily           Blue           1
      2      Sarah           Pink           1
      3       Bill            Red           2
      4       Bill         Yellow           2
      5     Alfred         Orange           1
      6       None            Red           1
      

      【讨论】:

        【解决方案4】:

        这里不需要转换。只需在临时数据帧df1 上使用mapvalue_counts,如下所示

        df1 = df.astype(str)
        df['countNames'] = df1['First_Name'].map(df1['First_Name'].value_counts())
        
        Out[802]:
          First_Name Favorite_Color  countNames
        0      Jared           Blue           1
        1       Lily           Blue           1
        2      Sarah           Pink           1
        3       Bill            Red           2
        4       Bill         Yellow           2
        5     Alfred         Orange           1
        6       None            Red           1
        

        【讨论】:

          猜你喜欢
          • 2015-07-15
          • 2016-04-04
          • 1970-01-01
          • 2022-11-07
          • 1970-01-01
          • 2021-11-08
          • 2017-05-17
          • 2014-12-03
          相关资源
          最近更新 更多