如何在Pandas中按Thing和Type分组对Value列进行归一化处理
Pandas实现分组归一化(按thing和type分组)
直接用groupby结合transform就能实现完全向量化的计算,不需要循环逐行处理,代码如下:
import pandas as pd # 针对已有DataFrame df执行以下代码 df['norm'] = df['value'] / df.groupby(['thing', 'type'])['value'].transform('mean')
原理说明
df.groupby(['thing', 'type'])['value']:按thing和type的组合对value列进行分组.transform('mean'):计算每组的均值,同时返回一个和原DataFrame行数一致的Series(每组内的所有行都会填充该组的均值)- 最后用原
value列除以这个均值Series,直接得到归一化后的norm列
示例验证
举个符合你描述的示例:
# 创建示例数据 data = { 'thing': ['a', 'a', 'b', 'b', 'a', 'a'], 'type': ['t1', 't1', 't1', 't1', 't2', 't2'], 'value': [1, 5, 3, 7, 4, 8] } df = pd.DataFrame(data) # 计算归一化列 df['norm'] = df['value'] / df.groupby(['thing', 'type'])['value'].transform('mean') print(df)
运行后输出:
thing type value norm 0 a t1 1 0.333333 # 1/( (1+5)/2 ) = 1/3 1 a t1 5 1.666667 # 5/3 2 b t1 3 0.600000 # 3/( (3+7)/2 ) = 3/5 3 b t1 7 1.400000 # 7/5 4 a t2 4 0.666667 # 4/( (4+8)/2 ) = 4/6 5 a t2 8 1.333333 # 8/6
完全符合你要求的分组归一化逻辑,全程都是Pandas的向量化操作,效率远高于逐行处理。
内容的提问来源于stack exchange,提问作者DM71
相关产品推荐
相关产品推荐

