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

pandas DataFrame按年分组的条件统计值跨期结转及报错解决

数据处理需求与开发问题

核心处理规则

按年份维度对DataFrame做分组计算,匹配满足条件的分组后完成数值调整:

  • 分组匹配条件:
    • 分组内「Severe cases U5」列的求和值为0
    • 分组内「Num_U5_Received_Severe_Treatment」列的求和值大于0
  • 满足条件后的处理动作:
    • 将当前分组的「Num_U5_Received_Severe_Treatment」求和值,累加至上一年度12月的同名字段中
    • 清空当前分组下的「Num_U5_Received_Severe_Treatment」列所有值

示例基础数据

data = [[2020, 11,  1, 1], [2020, 12,  2, 2], [2021, 1, 0, 0], [2021, 1, 0, 1]]
df = pd.DataFrame(data, columns = ['year', 'month', 'Severe cases U5', 'Num_U5_Received_Severe_Treatment'])

开发过程中的问题与卡点

第一阶段:groupby迭代报错

最初未掌握groupby的迭代结构,代码运行持续触发 TypeError: tuple indices must be integers or slices, not str 报错,对应初始代码:

for group in df.groupby('year'):
    if group['Severe cases U5'].sum() == 0 and group['Num_U5_Received_Severe_Treatment'].sum() > 0:
         pre_year = group['year'] - 1

报错原因:pandas的groupby迭代器每次返回(分组键值, 对应子DataFrame)组成的元组,无法直接用字符串字段名对元组做索引取值。

第二阶段:行级回写逻辑失效

目前已修正groupby的遍历写法(通过元组解包拿到分组键和子DataFrame),但仍无法定位到上一年12月的目标行完成数值累加,现有调试代码无法正常回写目标值,对应调试代码:

for year, group in df.groupby('year'):
        if (group['Severe cases U5'].sum() == 0 and group['Num_U5_Received_Severe_Treatment'].sum() > 0):
        
            year_current = np.unique(group['year'])[0] -1
            excess_death = group['Num_U5_Received_Severe_Treatment'].sum()
            group['Num_U5_Received_Severe_Treatment'] = 0
            print(excess_death)
            print(year_current)
    for month_row, row in group.iterrows():  
            if (row['year'] == year and row['month'] == 12): # 目标逻辑未生效
                    row['Num_U5_Received_Severe_Treatment'] =+ excess_death
                    print(row['Num_U5_Received_Severe_Treatment'])

现有代码的核心问题:

  • 查找12月行的循环缩进错误,跑到了groupby循环外部,仅能遍历到最后一个分组的子数据
  • iterrows返回的是行对象的副本,对副本直接赋值不会修改原DataFrame的对应值

内容的提问来源于stack exchange,提问作者ify

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 21:06:01