如何缩放 Pandas DataFrame 列?


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

为什么缩放很重要?

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

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

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

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

使用 Pandas 缩放 DataFrame 列

方法 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

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

# Print the original DataFrame
print("Original DataFrame:")
print(df)
print()

#  Min-Max Scaling
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)

# Apply min-max scaling to 'Salary' column
min_max_scaling(df, 'Salary')

# Print the DataFrame after min-max scaling
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

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

# Print the original DataFrame
print("Original DataFrame:")
print(df)
print()

# standardization 
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

# Apply standardization to 'Salary' column
standardization(df, 'Salary')

# Print the DataFrame after standardization
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

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

# Print the original DataFrame
print("Original DataFrame:")
print(df)
print()

# robust scaling
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

# Apply robust scaling to 'Salary' column
robust_scaling(df, 'Salary')

# Print the DataFrame after robust scaling
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

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

# Print the original DataFrame
print("Original DataFrame:")
print(df)
print()


import numpy as np
# log transformation
def log_transformation(df, column_name):
    df[column_name] = np.log(df[column_name])

# Apply log transformation to 'Salary' column
log_transformation(df, 'Salary')

# Print the DataFrame after log transformation
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

结论

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

更新于:2023年10月13日

2000+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告