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

Pandas分组后对指定列应用transform函数的最优实现方案

解决分组后指定列做transform的问题

你遇到的这个TypeError确实是pandas的已知问题——目前groupby.transform还不支持传入字典来为不同列指定不同的处理函数。不过我们有两种简单的方式绕开这个限制,完美实现你的需求:

方法一:拆分处理,合并结果

这种方法思路清晰,只对需要处理的列执行transform,再和原数据的保留列合并,效率很高:

import pandas as pd
import numpy as np
np.random.seed(123)
df = pd.DataFrame(
    data={"a": np.arange(10), "b": np.arange(10)[::-1], "c": np.random.choice(np.arange(10), size=10)},
    index=pd.Index(np.random.choice([1,2,3], size=10), name="id")
)

# 先定义z-score标准化函数
def z_score(x):
    return (x - x.mean()) / x.std()

# 1. 对需要标准化的列执行分组transform
target_cols = df.columns.drop("c")  # 自动获取除了c之外的所有列
transformed_part = df[target_cols].groupby("id").transform(z_score)

# 2. 提取不需要处理的原始列
keep_part = df[["c"]]

# 3. 按索引合并两部分,保持列顺序和原数据一致
final_result = pd.concat([transformed_part, keep_part], axis=1)[df.columns]
print(final_result)

方法二:分组apply内处理指定列

如果你的列非常多,不想手动筛选,用apply在每个分组内直接修改指定列会更灵活:

def process_single_group(group):
    # 遍历除了c之外的所有列,逐个做z-score
    for col in group.columns.drop("c"):
        group[col] = z_score(group[col])
    return group

final_result = df.groupby("id").apply(process_single_group)
print(final_result)

两种方法都能达到你的要求:每个id分组内的a、b列做z-score标准化,c列保留原始值。第一种方法更高效,因为只对需要处理的列做分组计算;第二种方法更适合列数多、需要排除少数列的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:14:15