如何用pandas groupby结合sklearn MinMaxScaler按分组实现特征归一化
按类目+日期分组实现特征归一化的实现代码
直接通过groupby配合自定义处理函数即可实现需求,完整可运行代码如下:
import pandas as pd import numpy as np from sklearn.preprocessing import MinMaxScaler # 读取测试数据 df=pd.read_csv('https://raw.githubusercontent.com/amanaroratc/hello-world/master/testdf.csv') # 配置项 ## 需要归一化的原始特征列 norm_cols = ['rank', 'ratings'] ## 分组维度:类目+日期 group_cols = ['category', 'date'] ## 归一化后输出的列名 output_cols = ['rank_norm_mm', 'ratings_norm_mm'] scaler = MinMaxScaler() # 定义分组内归一化函数 def group_norm(group): group[output_cols] = scaler.fit_transform(group[norm_cols]) return group # 分组执行归一化,结果直接合并到原DataFrame df = df.groupby(group_cols, group_keys=False).apply(group_norm) # 查看结果 print(df.head())
注意事项
- 参数
group_keys=False的作用是避免分组键被设为额外索引层级,保证返回结果的行顺序和原数据完全对齐 - 如果某个分组内某列的所有值完全相同,
MinMaxScaler计算时会生成NaN值,可通过nan_to_num填充默认值,修改处理函数即可:
def group_norm(group): scaled_data = scaler.fit_transform(group[norm_cols]) # 把NaN替换为0,可根据业务需求调整填充值 scaled_data = np.nan_to_num(scaled_data, nan=0.0) group[output_cols] = scaled_data return group
- 该方案可直接扩展到其他scaler(如
StandardScaler、RobustScaler),只需替换scaler实例即可。
内容的提问来源于stack exchange,提问作者AmanArora
相关产品推荐
相关产品推荐

