在Pandas的数据处理流程中,按分组计算数值列相关性以及分类变量编码是两项高频操作,前者可以帮助我们挖掘不同分组下变量间的关联规律,后者则是将非数值类型的分类数据转换为模型可识别的数值形式,两者结合能大幅提升数据预处理的完整度。

按分组计算数值列相关性
要实现按分组计算数值列相关性,核心思路是先通过groupby方法对数据进行分组,再对每个分组选取数值列调用相关性计算方法。Pandas的DataFrame和Series都内置了corr方法,可以计算不同列之间的相关系数,默认使用皮尔逊相关系数。
基础实现步骤
首先我们需要准备包含分组字段、数值字段的测试数据,以下是一份模拟的销售数据:
import pandas as pd
import numpy as np
# 构造测试数据
data = {
"category": ["A", "A", "A", "B", "B", "B", "C", "C", "C"],
"price": [10, 12, 15, 20, 22, 25, 30, 32, 35],
"sales": [100, 120, 130, 200, 210, 220, 300, 310, 320],
"rating": [4.5, 4.6, 4.7, 4.8, 4.9, 4.7, 4.9, 5.0, 4.8]
}
df = pd.DataFrame(data)
print(df)
接下来按category分组,计算每个分组内price、sales、rating三个数值列的相关性矩阵:
# 按category分组,计算数值列的相关性
corr_result = df.groupby("category").apply(lambda x: x[["price", "sales", "rating"]].corr())
print(corr_result)
上述代码中,groupby("category")先按照分类字段分组,apply方法对每个分组的数据执行匿名函数,匿名函数选取三个数值列后调用corr方法得到相关性矩阵。最终返回的结果是一个多级索引的DataFrame,第一层索引是分组值,第二层索引是每个分组内的相关性矩阵。
提取特定列的相关性
如果只需要获取价格和销量两个列的相关性,可以进一步筛选结果:
# 提取price和sales的相关系数 target_corr = corr_result.loc[:, "price"].loc[:, "sales"].reset_index() target_corr.columns = ["category", "price_sales_corr"] print(target_corr)
分类变量编码实践
分类变量编码是将非数值的分类数据转换为数值类型的过程,Pandas提供了多种内置编码方式,不同方式适用于不同的场景。
标签编码
标签编码会将每个分类值映射为一个唯一的整数,适合有序分类变量,比如学历等级、评分等级等。可以使用factorize方法实现:
# 对category列做标签编码 df["category_label"] = pd.factorize(df["category"])[0] print(df[["category", "category_label"]])
如果需要保留编码映射关系,可以单独存储映射字典:
# 获取编码映射关系 labels, uniques = pd.factorize(df["category"]) mapping = dict(zip(uniques, range(len(uniques)))) print(mapping)
独热编码
独热编码会为每个分类值创建一个新的二进制列,适合无序分类变量,避免模型误以为分类值之间存在顺序关系。可以使用get_dummies方法实现:
# 对category列做独热编码 category_dummies = pd.get_dummies(df["category"], prefix="category") # 合并回原DataFrame df = pd.concat([df, category_dummies], axis=1) print(df)
如果分类变量的取值较多,独热编码会导致特征维度急剧增加,此时可以考虑使用目标编码等其他方式,不过目标编码需要结合标签数据计算,不在Pandas内置功能范围内。
组合应用场景
在实际的数据分析流程中,经常需要先对分类变量编码,再按分组计算相关性。比如先对商品类别做独热编码,再按地区分组计算不同类别商品的销量和价格相关性:
# 构造包含地区和类别的测试数据
test_data = {
"region": ["East", "East", "West", "West", "East", "West"],
"category": ["A", "B", "A", "B", "A", "B"],
"price": [10, 20, 15, 25, 12, 22],
"sales": [100, 200, 150, 250, 110, 220]
}
test_df = pd.DataFrame(test_data)
# 对category做独热编码
test_df = pd.concat([test_df, pd.get_dummies(test_df["category"], prefix="cat")], axis=1)
# 按region分组,计算price和cat_A的相关性
group_corr = test_df.groupby("region").apply(lambda x: x["price"].corr(x["cat_A"]))
print(group_corr)
通过上述操作,我们可以快速得到不同地区下,类别A商品的价格和是否为类别A这两个变量的相关性,为后续的业务分析提供数据支撑。