如何使用Pandas对数据集按行实现[-1,+1]区间归一化
逐行归一化到[-1,1]区间实现方法
你原有的代码逻辑是逐列计算列内绝对值最大值,再做除法实现列维度的[-1,1]缩放,要改成逐行归一化,只需要把统计最大值的维度从列切换为行即可,不需要逐列循环,以下是两种可直接运行的实现方案:
方案1:纯Pandas实现(无额外依赖,执行效率高)
核心是通过axis=1参数指定逐行计算绝对值最大值,利用pandas的广播机制直接完成整表运算,同时兼容全0行的除0报错问题:
import pandas as pd df = pd.read_csv('/-----.csv') df_max_scaled = df.copy() # 逐行计算每行的绝对值最大值 row_abs_max = df_max_scaled.abs().max(axis=1) # 处理全0行:避免除以0报错,全0行归一化结果仍为0 row_abs_max[row_abs_max == 0] = 1 # 按行做除法缩放 df_max_scaled = df_max_scaled.div(row_abs_max, axis=0)
方案2:调用sklearn预处理模块实现
sklearn.preprocessing.MaxAbsScaler原生就是用来将数据缩放到[-1,1]区间的工具,默认按列计算缩放规则,要逐行归一化只需要对数据做转置后缩放,再转置回原结构即可:
from sklearn import preprocessing import pandas as pd df = pd.read_csv('/-----.csv') scaler = preprocessing.MaxAbsScaler() # 转置后做列归一化等价于原数据的行归一化,缩放完成后再转置回来 df_max_scaled = pd.DataFrame( scaler.fit_transform(df.T).T, index=df.index, columns=df.columns )
注意:如果你的数据表包含字符串、时间类非数值列,需要先将非数值列拆分出去,仅对数值类型的列执行归一化操作,否则会触发类型计算错误。
内容的提问来源于stack exchange,提问作者shervin saadat
相关产品推荐
相关产品推荐

