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
相关产品推荐
相关产品推荐

