如何在迭代分组后正确更新DataFrame中的对应行数据?
解决分组内计算差值并更新原始DataFrame的问题
你的问题出在:groupby返回的group是原始DataFrame的副本,修改副本里的列不会同步到原DataFrame,而且手动循环iterrows赋值不仅效率低,还容易因为索引匹配失误导致值放错位置。
直接用Pandas内置的分组计算方法就能搞定,不需要手动循环:
方法一:直接用groupby.diff()
这是最简洁的方式,专门用来计算分组内的前后差值:
import pandas as pd import numpy as np mydf = pd.read_csv("my.csv") # 按a、b分组,对c列计算与前一行的差值,结果自动对齐原DataFrame的行 mydf["forwardDelta"] = mydf.groupby(["a", "b"])["c"].diff()
方法二:用transform自定义计算
如果需要更复杂的分组内操作,可以用transform,它会把分组计算的结果映射回原DataFrame的对应行:
import pandas as pd import numpy as np mydf = pd.read_csv("my.csv") def calc_group_delta(group): return group["c"] - group["c"].shift(1) mydf["forwardDelta"] = mydf.groupby(["a", "b"]).transform(calc_group_delta)
这两种方法都能自动保证计算出的差值精准对应到原始DataFrame的正确行,而且比手动循环快得多,尤其是处理大数据量的时候。
内容的提问来源于stack exchange,提问作者Harry Stuart
相关产品推荐
相关产品推荐

