我有一个数据框:
df = pd.DataFrame({'Company': ['abc', 'xyz', 'def'], 'Q1-2019': [9.05, 8.64, 6.3],'Q2-2019': [8.94, 8.56, 7.09],'Q3-2019': [8.86, 8.45, 7.09],'Q4-2019': [8.34, 8.61, 7.25]})
这些数据是针对同一问题在四个季度内的平均回应。
我试图从这些数据中创建一个基准指数。为此,我想先对数据进行预处理,使用标准化或归一化方法。
如何对整个数据框进行标准化/归一化处理?有什么最佳方法可以实现这一点?
我可以对一行或一列进行处理,但对整个数据框进行处理时遇到了困难。
from sklearn.preprocessing import StandardScalerfrom sklearn.preprocessing import MinMaxScaler#define scalerscaler = MinMaxScaler() #or StandardScalerX = df.loc[1].TX = X.to_numpy()#transform datascaled = scaler.fit_transform(X)
回答:
如果我正确理解了你的需求,你可以使用ColumnTransformer
来对不同的列应用相同的转换(例如缩放)。
正如你从链接的文档中可以看到,你需要在元组中提供:
- 步骤的名称
- 选择的转换器(例如
StandardScaler
)或Pipeline
- 应用所选转换的列列表
代码示例
# 指定列columns = ['Q1-2019', 'Q2-2019', 'Q3-2019', 'Q4-2019']# 创建ColumnTransformer实例ct = ColumnTransformer([ ('scaler', StandardScaler(), columns)])# 拟合和转换输入数据框ct.fit_transform(df)array([[ 0.86955718, 0.93177476, 0.96056682, 0.46493449], [ 0.53109031, 0.45544147, 0.41859563, 0.92419906], [-1.40064749, -1.38721623, -1.37916245, -1.38913355]])
ColumnTransformer
将输出一个包含转换值的numpy数组,这些值是在输入数据集df
上拟合的。尽管现在没有列名,但数组列仍然按输入数据框的顺序排列,因此如果需要的话,很容易将数组转换为pandas数据框。