如何按年份统计各变量对应含非空值的唯一State数量
问题需求
针对DataFrame中的每个变量(Var1、Var2),统计每年内存在至少一个非空值的唯一State数量,并按指定格式输出结果。
原始DataFrame
| Year | State | Var1 | Var2 |
|---|---|---|---|
| 2018 | 1 | 1 | 3 |
| 2018 | 1 | 2 | NaN |
| 2018 | 1 | NaN | 1 |
| 2018 | 2 | NaN | 1 |
| 2018 | 2 | NaN | 2 |
| 2018 | 3 | 3 | NaN |
| 2019 | 1 | 1 | NaN |
| 2019 | 1 | 3 | NaN |
| 2019 | 1 | 2 | NaN |
| 2019 | 1 | NaN | NaN |
| 2019 | 2 | NaN | NaN |
| 2019 | 2 | 3 | NaN |
| 2020 | 1 | 1 | NaN |
| 2020 | 2 | NaN | 1 |
| 2020 | 2 | NaN | 3 |
| 2020 | 3 | 3 | NaN |
| 2020 | 4 | NaN | NaN |
| 2020 | 4 | 1 | NaN |
期望输出
Year 2018 2019 2020 Var1 Num of States w/ non-null 2 2 3 Var2 Num of States w/ non-null 2 0 1
解决方案
通过Pandas的分组、聚合和格式调整可以实现需求:
import pandas as pd # 假设原始数据已加载为df # 1. 按年份和州分组,判断每个变量是否存在非空值 grouped = df.groupby(['Year', 'State']).agg( Var1_has_non_null=('Var1', lambda x: x.notna().any()), Var2_has_non_null=('Var2', lambda x: x.notna().any()) ).reset_index() # 2. 按年份聚合,统计有非空值的州数量 result = grouped.groupby('Year').agg( Var1=('Var1_has_non_null', 'sum'), Var2=('Var2_has_non_null', 'sum') ).T # 3. 调整索引格式匹配期望输出 result.index = pd.MultiIndex.from_tuples( [(idx, 'Num of States w/ non-null') for idx in result.index], names=['', 'Year'] ) result.columns.name = None # 输出结果 print(result.to_string())
代码说明
- 分组判断非空:按
Year和State分组,用x.notna().any()判断该州在对应年份下是否有至少一个非空值,返回布尔值。 - 聚合统计数量:按
Year分组对布尔值求和(True记为1,False记为0),得到每个年份下有非空值的州数量。 - 格式调整:转置结果后设置多级索引,匹配期望的输出样式。
内容的提问来源于stack exchange,提问作者jii0302
相关产品推荐
相关产品推荐

