如何缩放 Pandas DataFrame 的列?

pandasserver side programmingprogramming更新于 2025/6/23 6:52:17

缩放是在数据分析中预处理数据的过程,确保数据集中的所有特征具有相似的范围,从而使它们更具可比性,并减少不同尺度对机器学习算法的影响。我们可以使用最小-最大缩放、标准化、鲁棒缩放和对数变换等方法来缩放 Pandas DataFrame 的列。在本文中,我们将深入探讨使用各种方法缩放 Pandas DataFrame 的过程。

为什么缩放很重要?

  • 数据中的某些特征可能具有较大的值,这些特征在分析或模型训练时可能占主导地位。缩放可确保所有特征具有相似的范围,防止某些特征在分析中占主导地位。

  • 一些机器学习算法,例如 K 最近邻和支持向量机,依赖于基于距离的计算。缩放可确保特征对计算的贡献均等。

  • 缩放还可以提高收敛速度和迭代算法(如梯度下降算法)的性能。

  • 缩放后,具有相似尺度的特征更容易进行比较。

使用 Pandas 缩放数据框列

方法 1:使用最小-最大缩放

最小-最大缩放也称为归一化。使用最小-最大缩放,我们可以将数据大小调整到固定范围,通常在 0 到 1 之间。原始分布形状将保持不变,同时保留最小值和最大值。

语法

df[column_name] = (df[column_name] - df[column_name].min()) / (df[column_name].max() - df[column_name].min())

此处,最小-最大缩放通过减去最小值并除以范围(最大值减去最小值),将列的值重新缩放到 0 到 1 之间。

示例

在下面的示例中,我们使用 min() 和 max() 方法计算列的最小值和最大值。然后,我们可以应用缩放公式来重新缩放 0 到 1 之间的值。

import pandas as pd

# 创建示例 DataFrame
data = {'Name': ['John', 'Emma', 'Tom', 'Emily', 'Mike'],
    'Salary': [50000, 80000, 45000, 70000, 90000]}
df = pd.DataFrame(data)

# 打印原始 DataFrame
print("Original DataFrame:")
print(df)
print()

# 最小-最大缩放
def min_max_scaling(df, column_name):
    min_value = df[column_name].min()
    max_value = df[column_name].max()
    df[column_name] = (df[column_name] - min_value) / (max_value - min_value)

# 对"Salary"列应用最小-最大缩放
min_max_scaling(df, 'Salary')

# 打印最小-最大缩放后的 DataFrame
print("DataFrame after Min-Max Scaling:")
print(df)
print()

输出

Original DataFrame:
    Name  Salary
0   John   50000
1   Emma   80000
2    Tom   45000
3  Emily   70000
4   Mike   90000

DataFrame after Min-Max Scaling:
    Name    Salary
0   John  0.111111
1   Emma  0.777778
2    Tom  0.000000
3  Emily  0.555556
4   Mike  1.000000

方法 2:使用标准化技术

标准化将数据转换为均值为零、方差为单位的数据。标准化后,数据以均值为中心,并根据标准差进行缩放。最终的分布的均值为 0,标准差为 1。

语法

df[column_name] = (df[column_name] - df[column_name].mean()) / df[column_name].std()

此处,标准化通过减去均值并除以标准差,将列的值转换为均值为零、方差为单位的数据。

示例

在下面的示例中,定义了一个名为 standardization 的函数来对指定列执行标准化。该函数计算列的平均值和标准差,然后应用标准化公式对值进行缩放。最后,在 DataFrame 的"Salary"列上调用该函数,对值进行标准化。修改后的 DataFrame 将被打印以显示标准化过程的结果。

import pandas as pd

# 创建示例 DataFrame
data = {'Name': ['John', 'Emma', 'Tom', 'Emily', 'Mike'],
        'Salary': [50000, 80000, 45000, 70000, 90000]}
df = pd.DataFrame(data)

# 打印原始 DataFrame
print("Original DataFrame:")
print(df)
print()

# 标准化
def standardization(df, column_name):
    mean_value = df[column_name].mean()
    std_value = df[column_name].std()
    df[column_name] = (df[column_name] - mean_value) / std_value

# 对"Salary"列应用标准化
standardization(df, 'Salary')

# 打印标准化后的 DataFrame
print("DataFrame after Standardization:")
print(df)
print()

输出

Original DataFrame:
    Name  Salary
0   John   50000
1   Emma   80000
2    Tom   45000
3  Emily   70000
4   Mike   90000

DataFrame after Standardization:
    Name    Salary
0   John -0.883788
1   Emma  0.675838
2    Tom -1.143726
3  Emily  0.155963
4   Mike  1.195713

方法 3:使用稳健缩放

稳健缩放与标准化有些类似,但它使用中位数和四分位距 (IQR) 代替平均值和标准差。异常值对稳健缩放的影响不大,因此它适用于具有极值的数据集。

语法

df[column_name] = (df[column_name] - df[column_name].median()) / (df[column_name].quantile(0.75) - df[column_name].quantile(0.25))

此处,稳健缩放使用中位数和四分位距 (IQR) 重新缩放列的值,IQR 是第 25 个百分位数 (Q1) 和第 75 个百分位数 (Q3) 之间的范围。

示例

在下面的示例中,定义了一个名为 robust_scaling 的函数来对指定列执行稳健缩放。函数内部会计算列的中位数、一四分位数 (q1)、三四分位数 (q3) 和四分位距 (IQR)。然后,通过减去中位数再除以 IQR,对列值进行缩放。最后,将该函数应用于 DataFrame 的"Salary"列,使其值进行稳健缩放。修改后的 DataFrame 会被打印出来,以显示稳健缩放过程的结果。

import pandas as pd

# 创建示例 DataFrame
data = {'Name': ['John', 'Emma', 'Tom', 'Emily', 'Mike'],
        'Salary': [50000, 80000, 45000, 70000, 90000]}
df = pd.DataFrame(data)

# 打印原始 DataFrame
print("Original DataFrame:")
print(df)
print()

# 稳健缩放
def robust_scaling(df, column_name):
    median_value = df[column_name].median()
    q1 = df[column_name].quantile(0.25)
    q3 = df[column_name].quantile(0.75)
    iqr = q3 - q1
    df[column_name] = (df[column_name] - median_value) / iqr

# 对"Salary"列应用稳健缩放
robust_scaling(df, 'Salary')

# 打印稳健缩放后的 DataFrame
print("DataFrame after Robust Scaling:")
print(df)
print()

输出

Original DataFrame:
    Name  Salary
0   John   50000
1   Emma   80000
2    Tom   45000
3  Emily   70000
4   Mike   90000

DataFrame after Robust Scaling:
    Name    Salary
0   John -0.666667
1   Emma  0.333333
2    Tom -0.833333
3  Emily  0.000000
4   Mike  0.666667

方法 4:使用对数变换方法

对数变换使用对数函数对数据进行非线性缩放。它可以降低包含高度倾斜数据的数据分布中倾斜度的影响。

语法

import numpy as np
df[column_name] = np.log(df[column_name])

此处,对数变换将对数函数应用于列的值,这有助于降低倾斜度的影响,并将较大的值压缩为较小的值。

示例

在下面的示例中,定义了一个名为 log_transformation 的函数来对指定列执行对数变换。在该函数中,使用 NumPy 库中的 np.log() 函数对列中的值进行对数变换。然后,该函数应用于 DataFrame 的"Salary"列,使值进行对数变换。修改后的 DataFrame 将被打印,以显示对数变换过程的结果。

import pandas as pd

# 创建示例 DataFrame
data = {'Name': ['John', 'Emma', 'Tom', 'Emily', 'Mike'],
        'Salary': [50000, 80000, 45000, 70000, 90000]}
df = pd.DataFrame(data)

# 打印原始 DataFrame
print("Original DataFrame:")
print(df)
print()

import numpy as np
# 对数变换
def log_transformation(df, column_name):
    df[column_name] = np.log(df[column_name])

# 对"Salary"列应用对数变换
log_transformation(df, 'Salary')

# 打印对数变换后的 DataFrame
print("DataFrame after Log Transformation:")
print(df)

输出

Original DataFrame:
    Name  Salary
0   John   50000
1   Emma   80000
2    Tom   45000
3  Emily   70000
4   Mike   90000

DataFrame after Log Transformation:
    Name     Salary
0   John  10.819778
1   Emma  11.289782
2    Tom  10.714418
3  Emily  11.156251
4   Mike  11.407565

结论

本文讨论了如何在数据处理和分析中缩放数据框列。缩放可确保特征具有相似的范围,从而使它们更具可比性,并减少不同尺度对机器学习算法的影响。我们可以使用不同的缩放技术,例如最小-最大缩放、标准化、稳健缩放和对数变换。


相关文章