Pandas对列执行减去均值除以标准差的标准化实现方法

数据标准化是数据预处理的核心步骤之一,减去均值除以标准差的标准化方式可以让数据服从均值为0、标准差为1的标准正态分布,消除不同特征量纲差异带来的影响。在Pandas中处理结构化数据时,我们可以通过多种灵活的方式实现该操作。
方法一:直接使用Pandas内置的mean和std方法
Pandas的DataFrame和Series对象都内置了mean()和std()方法,我们可以直接基于这两个方法完成标准化计算,这种方式不需要额外引入其他库,适合轻量级的预处理场景。
示例代码如下:
import pandas as pd
# 构造示例数据
data = {
'score': [85, 90, 78, 92, 88],
'age': [20, 22, 19, 21, 23],
'height': [170, 175, 168, 172, 174]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
# 对指定列执行标准化
cols_to_normalize = ['score', 'age', 'height']
for col in cols_to_normalize:
mean_val = df[col].mean()
std_val = df[col].std()
df[f'{col}_normalized'] = (df[col] - mean_val) / std_val
print("n标准化后的数据:")
print(df)
方法二:结合numpy实现向量化计算
numpy的向量化计算效率更高,当处理大规模数据时,可以结合numpy的mean和std函数完成标准化,减少循环带来的性能损耗。
示例代码如下:
import pandas as pd
import numpy as np
# 构造示例数据
data = {
'price': [100, 150, 120, 180, 130],
'quantity': [5, 8, 6, 9, 7]
}
df = pd.DataFrame(data)
# 提取需要标准化的列
cols = ['price', 'quantity']
# 计算均值和标准差
means = np.mean(df[cols], axis=0)
stds = np.std(df[cols], axis=0)
# 执行标准化
df[cols] = (df[cols] - means) / stds
print("标准化后的数据:")
print(df)
方法三:使用sklearn的StandardScaler模块
如果项目已经引入了sklearn库,使用StandardScaler是更规范的选择,它会自动对每列执行减去均值除以标准差的操作,还支持后续对新数据的统一标准化处理。
示例代码如下:
import pandas as pd
from sklearn.preprocessing import StandardScaler
# 构造示例数据
data = {
'math': [90, 85, 88, 92, 87],
'english': [80, 82, 79, 85, 81]
}
df = pd.DataFrame(data)
# 初始化标准化器
scaler = StandardScaler()
# 拟合并转换数据
normalized_data = scaler.fit_transform(df)
# 转回DataFrame
df_normalized = pd.DataFrame(normalized_data, columns=df.columns)
print("标准化后的数据:")
print(df_normalized)
print("n每列均值:", scaler.mean_)
print("每列标准差:", scaler.scale_)
不同方法的适用场景对比
我们可以通过下表快速了解三种方法的差异,方便根据实际需求选择:
| 实现方法 | 优势 | 适用场景 |
|---|---|---|
| Pandas内置方法 | 无需额外依赖,逻辑直观 | 小规模数据、轻量级预处理 |
| numpy向量化计算 | 计算效率高,适合批量处理 | 大规模数据、对性能要求高的场景 |
| sklearn StandardScaler | 支持持久化参数,适配机器学习流程 | 机器学习项目、需要统一预处理规则的场景 |
注意事项
- 执行标准化前需要确认列的数据类型为数值型,非数值列需要先做转换或者排除
- 如果某列的标准差为0,除法运算会出现报错,需要提前处理全为相同值的列
- 使用sklearn的StandardScaler时,如果后续有新数据需要标准化,直接调用
transform方法即可,不需要重新拟合