Pandas:分组后如何对指定列进行标准化处理?
解决DataFrameGroupBy无法赋值新列的问题
你遇到的问题核心是DataFrameGroupBy对象不支持直接赋值新列,得把标准化后的结果关联回原始的DataFrame才行,而不是在分组对象上操作。下面给你两种简单可行的解决方法:
方法一:直接在原DataFrame生成标准化列
假设你的原始DataFrame叫df,分组依据的列是group_col(即你用来分组的那一列),直接用groupby配合transform给原DataFrame加新列:
df['priceNormed'] = df.groupby('group_col')['price'].transform(lambda x: (x - x.mean()) / x.std())
transform会返回和原DataFrame行数完全匹配的序列,刚好可以直接赋值给新列,自动对应到每个分组的行。
方法二:先获取标准化结果再赋值
如果已经提前定义了grouped对象(比如grouped = df.groupby('group_col')),可以先提取标准化后的结果,再赋值给原DataFrame:
# 先计算每个分组的标准化价格 normed_price_series = grouped['price'].transform(lambda x: (x - x.mean()) / x.std()) # 赋值给原DataFrame的新列 df['priceNormed'] = normed_price_series
额外补充:用sklearn工具实现标准化
如果你习惯用sklearn的标准化工具,也可以自定义函数后用transform调用:
from sklearn.preprocessing import StandardScaler def standardize_group(x): scaler = StandardScaler() # 转换为二维数组后再标准化,最后展平为一维序列 return scaler.fit_transform(x.values.reshape(-1, 1)).flatten() df['priceNormed'] = df.groupby('group_col')['price'].transform(standardize_group)
内容的提问来源于stack exchange,提问作者ArieAI
相关产品推荐
相关产品推荐

