pandas groupby计算年差值报错 移除单数据点冲突行
人口统计数据分组求差值兼容缺失数据方案
原代码报错的核心原因是仅含单年度数据的分组下只有1条记录,取iloc[1]会触发索引越界,提前把数据不完整的id过滤掉即可解决问题,同时可以优化做差逻辑避免年份顺序影响结果准确性。
完整可运行代码
import pandas as pd # 此处可替换为实际数据集,两类单年度缺失场景都能自动兼容 data = [ {'id': '1', 'year': 2010, 'total_pob': 100, 'total_pob_fem': 20}, {'id': '1', 'year': 2020, 'total_pob': 200, 'total_pob_fem': 50}, {'id': '2', 'year': 2010, 'total_pob': 150, 'total_pob_fem': 50}, {'id': '2', 'year': 2020, 'total_pob': 300, 'total_pob_fem': 100}, {'id': '3', 'year': 2010, 'total_pob': 340, 'total_pob_fem': 25}, {'id': '3', 'year': 2020, 'total_pob': 400, 'total_pob_fem': 50}, {'id': '4', 'year': 2020, 'total_pob': 100, 'total_pob_fem': 150}, ] df = pd.DataFrame(data) # 1. 筛选同时拥有2010、2020两年完整数据的id valid_ids = df.groupby('id')['year'].agg(lambda x: {2010, 2020}.issubset(x.unique())).reset_index() valid_ids = valid_ids[valid_ids['year']]['id'].tolist() df_valid = df[df['id'].isin(valid_ids)].reset_index(drop=True) # 2. 计算有效id的两年指标差值 diff_part = (df_valid.set_index(['id', 'year']) .groupby('id') .apply(lambda g: g.xs(2010, level='year') - g.xs(2020, level='year')) .assign(year='diff') .set_index('year', append=True)) # 3. 拼接原始有效数据和差值行,得到最终结果 final_result = pd.concat([ diff_part, df_valid.set_index(['id', 'year']) ]).reset_index()
逻辑说明
- 过滤环节会自动剔除所有缺少年份数据的id,不管是缺2010年还是缺2020年的记录,都不会进入后续计算流程,从根源避免iloc索引越界报错
- 做差环节通过索引显式取对应年份的数据计算,不依赖分组内的行顺序,就算原始数据里同id下2020年的记录排在2010年前面,也不会出现差值符号算反的问题
- 最终输出的字段结构和原代码输出完全一致,包含
id、year、total_pob、total_pob_fem四个字段,其中year取值为diff的行就是对应id的两年指标差值
内容的提问来源于stack exchange,提问作者marco
相关产品推荐
相关产品推荐

