如何总结 pandas 数据框中每行的缺失值

How to sum up missing values per row in pandas dataframe

我有一个数据框:

import pandas as pd

d = {
'Country': ["Austria", "Austria", "Belgium", "USA", "USA", "USA", "USA"], 
'Number2020': [15, None, 18, 20, 22, None,  30],
'Number2021': [20, 25, 18, None, None, None, 32],    
}

df = pd.DataFrame(data=d)
df

    Country   Number2020    Number2021
0   Austria   15.0          20.0
1   Austria   NaN           25.0
2   Belgium   18.0          18.0
3   USA       20.0          NaN
4   USA       22.0          NaN
5   USA       NaN           NaN
6   USA       30.0          32.0

我想总结每个国家/地区的 nan 值。例如

    Country       Count_nans
    Austria       1
    
    USA           4

我过滤了数据框,只留下带有 nans 的行。

df_nan = df[df.Number2021.isna() | df.Number2020.isna()]

    Country   Number2020    Number2021
1   Austria   NaN           25.0
3   USA       20.0          NaN
4   USA       22.0          NaN
5   USA       NaN           NaN

所以它看起来像一个 groupby 操作?这个我试过了。

nasum2021 = df_nan['Number2021'].isna().sum()

df_nan['countNames2021'] = df_nan.groupby(['Number2021'])['Number2021'].transform('count').fillna(nasum2021)
df_nan

它给了我奥地利 1 南,美国 3 南,而它应该是 4。所以这是不对的。 在我的真实数据框中,我有大约 10 年的时间和大约 30 个国家/地区。谢谢!

您可以使用:

df.filter(like='Number').isna().sum(1).groupby(df['Country']).sum()

输出:

Country
Austria    1
Belgium    0
USA        4
dtype: int64

或者,首先过滤具有 NaN 的行以仅计算具有至少 1 个 NaN 的国家:

df[df.filter(like='Number').isna().any(1)].groupby('Country')['Country'].count()

输出:

Country
Austria    1
USA        3
Name: Country, dtype: int64

处理没有Country的所有列的解决方案-首先将其转换为索引,测试缺失值并聚合sum,最后求和列:

s = df.set_index('Country').isna().groupby('Country').sum().sum(axis=1)
print (s)
Country
Austria    1
Belgium    0
USA        4
dtype: int64

如果需要删除 0 值添加 boolean indexing:

s = s[s.ne(0)]

使用:

df.groupby('Country').apply(lambda x: x.isna().sum().sum())

输出:

你可以使用 pandas.DataFrame.<b>agg</b> along with pandas.DataFrame.<b>isna</b>:

>>> df.groupby('Country').agg(lambda x: x.isna().sum()).sum(axis=1)
Country
Austria    1
Belgium    0
USA        4
dtype: int64