You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 09:39:42