如何在Python Pandas数据框中标准化某些列?

12

以下Python代码仅返回一个数组,但我希望使用缩放后的数据替换原始数据。

from sklearn.preprocessing import StandardScaler
df = StandardScaler().fit_transform(df[['cost', 'sales']])
df
输出
array([[ 1.99987622, -0.55900276],
       [-0.49786658, -0.45658181],
       [-0.5146864 , -0.505097  ],
       [-0.48104676, -0.47814412],
       [-0.50627649,  1.9988257 ]])

原始数据

id  cost    sales   item
1   300       50    pen
2   3         88    bottle
3   1         70    drink
4   5         80    cup
5   2        999    ink
4个回答

35

只需将其重新分配即可

df[['cost', 'sales']] = StandardScaler().fit_transform(df[['cost', 'sales']])
df
Out[45]: 
   id      cost     sales    item
0   1  1.999876 -0.559003     pen
1   2 -0.497867 -0.456582  bottle
2   3 -0.514686 -0.505097   drink
3   4 -0.481047 -0.478144     cup
4   5 -0.506276  1.998826     ink

3

或者,如果使用列索引而不是列名:

import pandas as pd
from sklearn.preprocessing import StandardScaler
df = pd.DataFrame({"cost": [300,3,1,5,2], "sales": [50,88,70,80,999], "item": ["pen","bottle","drink","cup","ink"]})

# Scale selected columns by index
df.iloc[:, 0:2] = StandardScaler().fit_transform(df.iloc[:, 0:2])

       cost     sales    item
0  1.999876 -0.559003     pen
1 -0.497867 -0.456582  bottle
2 -0.514686 -0.505097   drink
3 -0.481047 -0.478144     cup
4 -0.506276  1.998826     ink

Scaler对象也可以被保存,这样就可以基于现有的Scaler对“新数据”进行缩放:

df = pd.DataFrame({"cost": [300,3,1,5,2], "sales": [50,88,70,80,999], "item": ["pen","bottle","drink","cup","ink"]})
df_new = pd.DataFrame({"cost": [299,5,12,64,2], "sales": [55,99,48,20,999], "item": ["pen","bottle","drink","cup","ink"]})

# Set up scaler
scaler = StandardScaler().fit(df.iloc[:, 0:2])

# Scale original data
df.iloc[:, 0:2] = scaler.transform(df.iloc[:, 0:2])

# Scale new data 
df_new.iloc[:, 0:2] = scaler.transform(df_new.iloc[:, 0:2])

1

您可以使用 scale 来标准化特定的列:

from sklearn.preprocessing import scale
cols = ['cost', 'sales']
df[cols] = scale(df[cols])

scale 函数对每一列进行均值减法和样本标准差除法。

示例:

# Prep
import pandas as pd
import numpy as np
from sklearn.preprocessing import scale

# Sample data
df = pd.DataFrame({
    'cost':[300, 3, 1, 5, 2],
    'sales':[50, 88, 70, 80, 999],
    'item': ['pen', 'bottle', 'drink', 'cup', 'ink']
})

# Standardize columns
cols = ['cost', 'sales']
df[cols] = scale(df[cols])

0
如果您想要获得 sklearn Pipeline 的好处(方便/封装、联合参数选择和防止泄漏),您可以使用 ColumnTransformer
preproc = ColumnTransformer(
    transformers=[
        ('scale', StandardScaler(), ["cost", "sales"]),
    ],
    remainder="passthrough",
)

有几种方法可以指定哪些列进入缩放器,请查看文档。现在你可以像@Peter提到的那样保存缩放器对象,而且你也不必一遍又一遍地重复切片:

df = preproc.fit_transform(df)
df_new = preproc.transform(df)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接