使用Pandas计算每行的NaN值数量

8

我正在尝试找出如何在我的数据框中逐行输出“First_Name”列的频率。到目前为止,我已经成功地做到了这一点,但我还想知道如何计算每行中的NaN值和非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库来进行回答。

4个回答

4

如果我理解得正确,这应该能满足您的需求。

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

1
同样的想法;我喜欢.fillna(nasum)的语法,因为它读起来更加简单明了:D。这也支持downcast='int'作为参数,因为这些都是整数。+1 - ALollz
1
df.fillna(nasum) 会用 nasum 填充所有列中的 NA 吗?我想避免这种情况。 - moys
添加了使用 .fillna(nasum) 的解决方案。感谢建议。 - moys

3

尝试:

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

1

解决问题的“快速”方法之一是将其转换为字符串:

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

1

你不需要在这里进行转换。只需在临时数据框 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接