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
相关产品推荐
相关产品推荐

