零基础小白入门:用 Pandas 做数据标准化
如果你是刚接触数据分析的 "小白",可能会疑惑:什么是 "数据标准化"?为什么要做这件事?这篇文章会用大白话拆解核心概念,把复杂的方法变成 "一步一步能跟着做" 的指南,帮你轻松入门。
一、先搞懂:什么是数据标准化?为什么要做?
1. 用例子理解 "数据尺度问题"
假设你有一份班级数据(就像文中的例子),包含 "文化平均分(60-90 分)""体育平均分(30-50 分)""挂科率(10%-20%)"。这些数据的 "尺度" 完全不一样:
- 文化分差 10 分很常见,挂科率差 10 分就天差地别了。
如果直接用这些数据做分析(比如比较哪个班级综合表现好),计算机可能会 "偏爱大数字"(比如文化分),忽略小数字(比如挂科率)的影响 ------ 这就像用 "米" 和 "厘米" 一起称重,结果肯定不准。
2. 数据标准化的作用
简单说,标准化就是把不同尺度的数据,变成同一尺度(比如都缩到 0-1 之间,或都围绕 0 波动),让它们能公平比较,也能让后续的分析 / 算法(比如机器学习)更准确。
二、核心准备:先搭好 "工具环境"
文中用了两个 Python 库:pandas
(处理表格数据)和numpy
(做数学计算),还有一份班级数据。
1. 先 "导入工具" 和 "加载数据"
你只需要复制下面的代码到 Python(比如 Jupyter Notebook)里运行,就能拿到数据:
python
# 导入需要的工具库
import numpy as np
import pandas as pd
# 加载班级数据(直接从网上获取,不用自己找文件)
df = pd.read_excel('https://labfile.oss.aliyuncs.com/courses/40611/%E6%95%B0%E6%8D%AE%E6%A0%87%E5%87%86%E5%8C%96.xlsx')
# 查看前5行数据(确认数据加载成功)
print(df.head())
运行后会看到这样的表格(和文中一致):
班级 | 文化平均分成绩 | 体育平均分 | 优秀率 | 挂科率 |
---|---|---|---|---|
0 | 71 | 39 | 19 | 10 |
1 | 61 | 45 | 13 | 19 |
2 | 77 | 30 | 13 | 10 |
三、13 种标准化方法:大白话 + 代码 + 用法
文中讲了 13 种方法,我们按 "常用程度" 和 "简单程度" 排序,每个方法都讲 "是什么、怎么算、怎么用、适合场景"。
1. 最常用:Min-Max 标准化(缩到 0-1 之间)
是什么?
把数据 "挤压" 到 0 到 1 的区间里,原始数据的最小值会变成 0,最大值会变成 1,其他数据按比例缩小。
比如 "体育平均分" 原始范围是 30-45,标准化后:30→0,45→1,39→(39-30)/(45-30)=0.6。
公式(不用记,理解就行):
新数据 = (原始数据 - 数据最小值) / (数据最大值 - 数据最小值)
代码(复制就能用):
python
# 定义Min-Max标准化函数
def min_max_normalize(df):
return (df - df.min()) / (df.max() - df.min())
# 对数据做标准化
df_min_max = min_max_normalize(df)
# 查看结果(前5行)
print(df_min_max.head())
适合场景:
- 希望数据在固定区间(0-1)内,比如 "计算班级综合得分"(得分范围 0-1,直观)。
- 缺点:如果数据里有极端值(比如某个班级文化分突然 100 分),会让其他数据挤在一起,不准。
2. 适合正态分布:Z-score 标准化(均值 0,标准差 1)
是什么?
把数据变成 "围绕 0 波动" 的形式:所有数据的平均值会变成 0,标准差(衡量数据分散程度)会变成 1。
比如 "文化平均分" 原始均值是 75.25,标准差是 8.95,某班级 71 分标准化后:(71-75.25)/8.95≈-0.47(表示比均值低 0.47 个标准差)。
公式(不用记):
新数据 = (原始数据 - 数据平均值) / 数据标准差
代码:
python
# 定义Z-score标准化函数
def z_score_normalize(df):
return (df - df.mean()) / df.std()
# 对数据做标准化
df_z_score = z_score_normalize(df)
# 查看结果
print(df_z_score.head())
适合场景:
- 数据接近 "正态分布"(比如考试分数、身高体重),比如 "分析班级成绩是否正常"。
- 优点:不受极端值影响,适合后续做机器学习(比如线性回归)。
3. 看比例:归一化(Sum Normalization)
是什么?
把每个数据变成 "它占总和的比例",所有数据加起来等于 1(或 100%)。
比如 "班级" 列有 1-19 个班级,总和是 190,1 班标准化后就是 1/190≈0.005(占比 0.5%)。
公式:
新数据 = 原始数据 / 所有数据的总和
代码:
python
# 定义归一化函数
def sum_normalize(df):
return df / df.sum()
# 对数据做标准化
df_sum = sum_normalize(df)
# 查看结果
print(df_sum.head())
适合场景:
- 想知道 "每个数据的占比",比如 "各班级优秀率占总优秀率的比例"。
4. 消均值:中心化(Centering)
是什么?
把数据 "往下挪",让所有数据的平均值变成 0。
比如 "挂科率" 原始均值是 14.45,某班级挂科率 10,标准化后就是 10-14.45=-4.45(表示比均值低 4.45)。
公式:
新数据 = 原始数据 - 数据平均值
代码:
python
# 定义中心化函数
def centering(df):
return df - df.mean()
# 对数据做标准化
df_centered = centering(df)
# 查看结果
print(df_centered.head())
适合场景:
- 想关注 "数据偏离均值的程度",比如 "分析哪个班级挂科率比平均水平低多少"。
5. 其他常用方法(简单了解 + 代码)
剩下的方法原理更简单,我们直接用 "表格 + 代码" 快速掌握:
方法名称 | 核心逻辑 | 适合场景 | 代码(复制即用) |
---|---|---|---|
均值化 | 数据除以平均值,让平均值变成 1 | 看数据是平均值的几倍,比如 "某班文化分是平均的 1.2 倍" | def mean_normalize(df): return df/df.mean() ; df_mean = mean_normalize(df) |
区间化 | 缩到自定义区间(比如 1-5),比 Min-Max 灵活 | 需要指定区间,比如 "把得分缩到 1-5 分制" | def interval_normalize(df,a=1,b=5): return a+(b-a)*(df-df.min())/(df.max()-df.min()) ; df_interval = interval_normalize(df) |
最小值化 | 数据除以最小值,让最小值变成 1 | 看数据是最小值的几倍,比如 "某班体育分是最低分的 1.5 倍" | def min_value_normalize(df): return df/df.min() ; df_min_value = min_value_normalize(df) |
最大值化 | 数据除以最大值,让最大值变成 1 | 看数据接近最大值的程度,比如 "某班优秀率是最高优秀率的 80%" | def max_value_normalize(df): return df/df.max() ; df_max_value = max_value_normalize(df) |
6. 特殊场景:指标处理(正向 / 负向 / 中间型 / 区间型)
这些方法是 "针对评价指标" 的标准化,比如分析 "班级综合表现" 时,不同指标的 "好坏方向" 不同:
- 正向指标:数值越大越好(比如优秀率);
- 负向指标:数值越小越好(比如挂科率);
- 中间型指标:数值越接近某个 "最佳值" 越好(比如 "出勤率" 最佳是 95%,太高太低都不好);
- 区间型指标:数值在某个 "最佳区间" 内最好(比如 "平均分" 在 70-80 之间最好)。
(1)正向指标处理(和 Min-Max 一样,越大越接近 1)
python
def positive_indicator(df):
return (df - df.min()) / (df.max() - df.min())
df_positive = positive_indicator(df) # 优秀率用这个方法,越大得分越高
(2)负向指标处理(反向 Min-Max,越小越接近 1)
python
def negative_indicator(df):
return (df.max() - df) / (df.max() - df.min())
df_negative = negative_indicator(df) # 挂科率用这个方法,越小得分越高
(3)中间型指标处理(越接近 "最佳值" 越接近 1)
比如 "体育平均分最佳是 40 分":
python
def intermediate_indicator(df, x_best): # x_best是你定的最佳值
M = np.max(np.abs(df - x_best)) # 计算最大偏离度
return 1 - np.abs(df - x_best) / M
x_best = 40 # 假设体育平均分最佳是40
df_intermediate = intermediate_indicator(df['体育平均分'], x_best)
(4)区间型指标处理(在 "最佳区间" 内得 1,超出则扣分)
比如 "文化平均分最佳区间是 70-80":
python
def interval_indicator(df, a, b): # a=区间下限,b=区间上限
M = np.max([a - df.min(), df.max() - b]) # 最大偏离度
result = df.copy()
result[df < a] = 1 - (a - df[df < a]) / M # 低于区间:越近得分越高
result[(df >= a) & (df <= b)] = 1 # 在区间内:得1
result[df > b] = 1 - (df[df > b] - b) / M # 高于区间:越近得分越高
return result
a = 70 # 文化分最佳区间下限
b = 80 # 上限
df_interval = interval_indicator(df['文化平均分成绩'], a, b)
四、怎么选:不同场景用什么方法?
最后给你一张 "选择指南表",不用再纠结:
你的需求 | 推荐方法 |
---|---|
数据要缩到 0-1,做综合评分 | Min-Max 标准化 / 正向指标 |
数据是正态分布(比如考试分),做机器学习 | Z-score 标准化 |
想知道各数据的占比 | 归一化(Sum) |
想分析数据偏离平均值多少 | 中心化 |
指标越小越好(比如挂科率) | 负向指标处理 |
指标要接近某个最佳值 / 区间(比如出勤率) | 中间型 / 区间型指标处理 |
五、动手试试!
- 复制文中的 "导入库和数据" 代码,先拿到数据;
- 选 1-2 个方法(比如 Min-Max 和负向指标),复制代码运行;
- 对比原始数据和标准化后的数据,看看变化 ------ 你会发现数据真的 "变整齐" 了!
刚开始不用记所有公式,重点是理解 "每种方法的作用",用到时再查代码就好~