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

Python中如何用groupby分组处理后更新原始DataFrame

实现方法

直接修改groupby返回的分组对象无法更新原DataFrame,因为分组默认返回的是原数据的切片副本,修改副本不会同步到原df。可以用以下两种常用方案实现需求:

方法1:遍历分组时通过索引回写原数据

利用分组对象保留原DataFrame索引的特性,处理完分组数据后直接赋值给原df对应索引的位置,示例代码:

import pandas as pd
import numpy as np

arr = np.array([1, 2, 4, 7, 11, 16, 22, 29, 37, 46])
df = pd.DataFrame({'grain': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B']})
df["target"] = arr

for group_name, group_df in df.groupby("grain"):
    if group_name == "A":
        # 示例处理逻辑:分组A的target值乘以2
        processed_value = group_df['target'] * 2
        # 回写原df
        df.loc[group_df.index, 'target'] = processed_value
    if group_name == "B":
        # 示例处理逻辑:分组B的target值加3
        processed_value = group_df['target'] + 3
        # 回写原df
        df.loc[group_df.index, 'target'] = processed_value

这种方法适合处理逻辑复杂、需要逐组做个性化操作的场景。

方法2:使用groupby.apply封装处理逻辑(更推荐的pandas风格写法)

把不同分组的处理逻辑封装到一个函数中,通过apply直接返回处理后的结果,自动更新到原数据:

def process_group(group):
    if group.name == "A":
        group['target'] = group['target'] * 2
    elif group.name == "B":
        group['target'] = group['target'] + 3
    return group

# 直接覆盖原df即可
df = df.groupby("grain", group_keys=False).apply(process_group)

如果分组数量多,还可以用处理函数字典简化判断,避免写多层if分支:

# 定义不同分组的处理函数
process_func = {
    "A": lambda x: x * 2,
    "B": lambda x: x + 3
}

df['target'] = df.groupby('grain')['target'].transform(lambda x: process_func[x.name](x))

这种写法代码更简洁,执行效率也比手动遍历分组更高。

注意事项

  • 不要在遍历groupby的过程中新增/删除原df的行,否则会导致索引不匹配,回写数据出错
  • 如果只需要修改单列数据,优先用transform方法,性能比全量apply更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:06:04