如何总结 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
我有一个数据框:
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