如何在DataFrame分组迭代操作后将结果同步回主DataFrame?
解决方案
你遇到的核心问题是:遍历groupby得到的df_group是原DataFrame的副本,修改副本不会同步到原数据。要在循环内直接让修改反映到主DataFrame,可以利用索引定位赋值的方式,具体实现如下:
循环内直接修改主DataFrame的方案
for group, df_group in df_dates.groupby(["team", "metric"]): team, metric = group[0], group[1] # 简化_DEFAULT行的获取(用xs比loc更简洁) default_serie = df_group.xs("_DEFAULT", level=1).iloc[0] # 对当前分组执行fillna操作 filled_group = df_group.apply(lambda row: row.fillna(default_serie), axis=1) # 关键:通过索引将修改后的数据直接赋值回原DataFrame df_dates.loc[filled_group.index] = filled_group
原理说明
df_group的索引和原df_dates中对应分组的行索引完全一致- 用
df_dates.loc[filled_group.index]定位到原DataFrame中该分组的所有行,直接用填充后的filled_group覆盖,就能实现修改同步
更简洁的非循环替代方案(可选)
如果不想用循环,也可以直接用groupby.apply一次性完成所有分组的处理,代码更简洁:
def fill_group_with_default(df_group): default_serie = df_group.xs("_DEFAULT", level=1).iloc[0] return df_group.apply(lambda row: row.fillna(default_serie), axis=1) # 直接覆盖原DataFrame df_dates = df_dates.groupby(["team", "metric"]).apply(fill_group_with_default)
内容的提问来源于stack exchange,提问作者Fernando Jesus Garcia Hipola
相关产品推荐
相关产品推荐

