遍历多个DataFrame时如何保存分组操作后的修改?
问题:DataFrame分组操作后修改未保存?
我通过for循环遍历DataFrame列表,执行分组求和操作后,原DataFrame并未保存修改结果。
示例代码
首先创建多个测试用DataFrame:
import pandas as pd df_1 = pd.DataFrame({'col_0' : ['A', 'A', 'A', 'D', 'E'], 'col_1' : ['A', 'B', 'C', 'D', 'E'],'col_2' : [5, 4, 8, 9, 4],'col_3' : [6, 8, 3, 7, 6]}) df_2 = pd.DataFrame({'col_0' : ['A', 'A', 'A', 'D', 'E'], 'col_1' : ['A', 'A', 'B', 'E', 'D'],'col_2' : [4, 9, 6, 7, 4],'col_3' : [4, 5, 6, 8, 4]}) df_3 = pd.DataFrame({'col_0' : ['A', 'A', 'A', 'D', 'E'], 'col_1' : ['A', 'A', 'B', 'E', 'D'],'col_2' : [9, 5, 5, 4, 5],'col_3' : [7, 2, 9, 3, 8]}) df_4 = pd.DataFrame({'col_0' : ['A', 'A', 'A', 'D', 'E'], 'col_1' : ['A', 'C', 'A', 'D', 'E'],'col_2' : [2, 4, 4, 1, 6],'col_3' : [1, 9, 2, 6, 5]}) df_5 = pd.DataFrame({'col_0' : ['A', 'A', 'A', 'D', 'E'], 'col_1' : ['A', 'E', 'A', 'E', 'D'],'col_2' : [4, 7, 5, 0, 1],'col_3' : [2, 6, 5, 4, 2]}) df_6 = pd.DataFrame({'col_0' : ['A', 'A', 'A', 'D', 'E'], 'col_1' : ['A', 'E', 'C', 'A', 'B'],'col_2' : [7, 6, 8, 6, 7],'col_3' : [5, 6, 8, 5, 7]}) df_7 = pd.DataFrame({'col_0' : ['A', 'A', 'A', 'D', 'E'], 'col_1' : ['A', 'D', 'C', 'A', 'B'],'col_2' : [3, 4, 8, 8, 9],'col_3' : [6, 3, 9, 6, 1]})
将DataFrame存入列表:
lista = [df_1, df_2, df_3, df_4, df_5, df_6, df_7]
定义分组函数并执行循环:
def group(df): df = df.groupby(['col_0','col_1']).sum() return df for i in lista: group(i)
问题现象
循环执行后,调用原df_2仍显示原始数据:
col_0 col_1 col_2 col_3 0 A A 4 4 1 A A 9 5 2 A B 6 6 3 D E 7 8 4 E D 4 4
预期结果应为分组求和后的结果:
col_2 col_3 col_0 col_1 A A 13 9 B 6 6 D E 7 8 E D 4 4
解决方法
问题核心是:groupby().sum()返回新的DataFrame对象,不会修改原对象。循环中仅调用group(i)但未将结果保存,因此原数据无变化。可以通过以下两种方式保存修改:
方法1:更新列表中的元素
遍历列表时使用索引,将分组后的结果重新赋值给列表对应位置:for idx in range(len(lista)): lista[idx] = group(lista[idx]) # 此时lista[1]即为分组后的df_2 print(lista[1]) # 若需要更新原变量df_2,可再赋值 df_2 = lista[1]方法2:直接重新赋值原变量
如果需要保留原变量名,可直接对每个DataFrame单独处理:df_1 = group(df_1) df_2 = group(df_2) df_3 = group(df_3) # ... 依次处理剩余DataFrame
补充说明:Pandas的多数数据操作(如分组、过滤、合并等)默认返回新对象,而非原地修改,这是为了避免意外破坏原始数据。groupby().sum()没有inplace=True参数,因此必须通过赋值操作保存结果。
内容的提问来源于stack exchange,提问作者Alejandro
相关产品推荐
相关产品推荐

