本文目录导读:

我来详细介绍Pandas进行数据归一化的几种常用方法。
准备示例数据
import pandas as pd
import numpy as np
# 创建示例数据
data = {
'年龄': [25, 30, 35, 40, 45, 50],
'收入': [50000, 60000, 75000, 80000, 120000, 150000],
'消费分数': [60, 70, 80, 90, 95, 85]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
Min-Max归一化(0-1区间)
def min_max_normalize(df, columns=None):
"""
Min-Max归一化:将数据缩放到[0,1]区间
公式: X_norm = (X - X_min) / (X_max - X_min)
"""
if columns is None:
columns = df.columns
df_normalized = df.copy()
for col in columns:
min_val = df[col].min()
max_val = df[col].max()
df_normalized[col] = (df[col] - min_val) / (max_val - min_val)
return df_normalized
# 应用Min-Max归一化
df_minmax = min_max_normalize(df, ['年龄', '收入', '消费分数'])
print("\nMin-Max归一化结果:")
print(df_minmax.round(3))
Z-Score标准化(均值为0,标准差为1)
def z_score_normalize(df, columns=None):
"""
Z-Score标准化:使数据服从标准正态分布
公式: X_std = (X - μ) / σ
"""
if columns is None:
columns = df.columns
df_normalized = df.copy()
for col in columns:
mean_val = df[col].mean()
std_val = df[col].std()
df_normalized[col] = (df[col] - mean_val) / std_val
return df_normalized
# 应用Z-Score标准化
df_zscore = z_score_normalize(df, ['年龄', '收入', '消费分数'])
print("\nZ-Score标准化结果:")
print(df_zscore.round(3))
使用sklearn进行归一化
from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler
# 方法1:Min-Max归一化
scaler_minmax = MinMaxScaler()
df_sklearn_minmax = pd.DataFrame(
scaler_minmax.fit_transform(df[['年龄', '收入', '消费分数']]),
columns=['年龄_minmax', '收入_minmax', '消费分数_minmax']
)
print("\nSklearn Min-Max归一化:")
print(df_sklearn_minmax.round(3))
# 方法2:Z-Score标准化
scaler_standard = StandardScaler()
df_sklearn_standard = pd.DataFrame(
scaler_standard.fit_transform(df[['年龄', '收入', '消费分数']]),
columns=['年龄_std', '收入_std', '消费分数_std']
)
print("\nSklearn Z-Score标准化:")
print(df_sklearn_standard.round(3))
# 方法3:Robust缩放(对异常值鲁棒)
scaler_robust = RobustScaler()
df_sklearn_robust = pd.DataFrame(
scaler_robust.fit_transform(df[['年龄', '收入', '消费分数']]),
columns=['年龄_robust', '收入_robust', '消费分数_robust']
)
print("\nRobust缩放(基于中位数和IQR):")
print(df_sklearn_robust.round(3))
自定义归一化函数
def custom_normalize(df, method='minmax', columns=None):
"""
自定义归一化函数,支持多种方法
"""
if columns is None:
columns = df.columns
df_normalized = df.copy()
for col in columns:
if method == 'minmax':
# Min-Max归一化
min_val = df[col].min()
max_val = df[col].max()
df_normalized[col] = (df[col] - min_val) / (max_val - min_val)
elif method == 'zscore':
# Z-Score标准化
mean_val = df[col].mean()
std_val = df[col].std()
df_normalized[col] = (df[col] - mean_val) / std_val
elif method == 'maxabs':
# 最大绝对值归一化
max_abs = df[col].abs().max()
df_normalized[col] = df[col] / max_abs
elif method == 'median':
# 中位数归一化
median_val = df[col].median()
iqr_val = df[col].quantile(0.75) - df[col].quantile(0.25)
df_normalized[col] = (df[col] - median_val) / iqr_val
return df_normalized
# 使用自定义函数
df_custom = custom_normalize(df, method='minmax', columns=['年龄', '收入'])
print("\n自定义归一化结果:")
print(df_custom.round(3))
实用案例:混合数据处理
def normalize_mixed_data(df, numeric_columns, method='zscore'):
"""
处理混合类型数据的归一化
"""
df_normalized = df.copy()
# 仅对数值列进行归一化
for col in numeric_columns:
if method == 'zscore':
mean_val = df[col].mean()
std_val = df[col].std()
df_normalized[f'{col}_normalized'] = (df[col] - mean_val) / std_val
elif method == 'minmax':
min_val = df[col].min()
max_val = df[col].max()
df_normalized[f'{col}_normalized'] = (df[col] - min_val) / (max_val - min_val)
return df_normalized
# 创建包含混合类型的数据
mixed_data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 35, 40],
'收入': [50000, 60000, 75000, 80000],
'性别': ['男', '女', '男', '女'],
'消费分数': [60, 70, 80, 90]
}
df_mixed = pd.DataFrame(mixed_data)
# 对数值列进行归一化
df_mixed_normalized = normalize_mixed_data(df_mixed, ['年龄', '收入', '消费分数'], method='zscore')
print("\n混合数据归一化结果:")
print(df_mixed_normalized.round(3))
批量处理并保存结果
def batch_normalize_and_save(df, normalize_methods=['minmax', 'zscore', 'robust']):
"""
批量应用不同的归一化方法并保存结果
"""
results = {}
for method in normalize_methods:
if method == 'minmax':
normalized_df = custom_normalize(df, method='minmax')
elif method == 'zscore':
normalized_df = custom_normalize(df, method='zscore')
elif method == 'robust':
normalized_df = custom_normalize(df, method='median')
results[method] = normalized_df
return results
# 批量处理
all_normalizations = batch_normalize_and_save(df[['年龄', '收入', '消费分数']])
# 显示每种方法的结果
for method, normalized_df in all_normalizations.items():
print(f"\n{method.upper()} 归一化:")
print(normalized_df.round(3))
选择建议
- Min-Max归一化:适用于有明确边界的场景,如像素值[0,255]
- Z-Score标准化:适用于数据近似正态分布,需处理异常值
- Robust缩放:数据包含异常值时更稳定
- MaxAbs归一化:稀疏数据或已有正负值的数据
这些方法可以根据具体需求灵活选择和应用!
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播