如何缩放 Pandas DataFrame 的列?
缩放是在数据分析中预处理数据的过程,确保数据集中的所有特征具有相似的范围,从而使它们更具可比性,并减少不同尺度对机器学习算法的影响。我们可以使用最小-最大缩放、标准化、鲁棒缩放和对数变换等方法来缩放 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
结论
本文讨论了如何在数据处理和分析中缩放数据框列。缩放可确保特征具有相似的范围,从而使它们更具可比性,并减少不同尺度对机器学习算法的影响。我们可以使用不同的缩放技术,例如最小-最大缩放、标准化、稳健缩放和对数变换。