Pandas如何计算结构不同两表各分组num2与num1的相关系数
按名称分组计算两表字段相关系数实现方案
问题场景
现有两张pandas数据表:
data1:每个日期对应唯一的num1字段值data2:每个日期下按不同name分类,分别对应一个num2字段值
需要计算每个name对应的num2值序列与num1值序列的相关系数,要求尽量不拆分表、不做大量表结构重构操作。
原始测试数据构造代码如下:
data1 = {'date': ['2022-01-03', '2022-01-04', '2022-01-05'], 'num1': ['.024', '.035', '.04']} data2 = {'date': ['2022-01-03', '2022-01-03', '2022-01-03', '2022-01-04', '2022-01-04', '2022-01-04', '2022-01-05','2022-01-05','2022-01-05'], 'name': ['name1', 'name2', 'name3', 'name1', 'name2', 'name3', 'name1', 'name2', 'name3'], 'num2':['20','200','149','36','174','400','45','100','12']} data1 = pd.DataFrame(data1).set_index('date') data2 = pd.DataFrame(data2).set_index('date') print(data1) print(data2)
实现方法
不需要拆分data2为多个独立子表,仅需两步即可完成计算:
- 先将字符串格式的数值字段转为浮点型,再基于日期索引将
num1关联到data2中——因为data1每个日期对应唯一num1,关联后不会出现数据重复或错位 - 按
name字段分组,对每个分组直接计算num1和num2的皮尔逊相关系数即可
完整实现代码:
import pandas as pd # 字段类型转换 data1['num1'] = data1['num1'].astype(float) data2['num2'] = data2['num2'].astype(float) # 按日期索引关联num1 df_merged = data2.join(data1['num1']) # 分组计算相关系数 corr_res = df_merged.groupby('name').apply(lambda group: group['num1'].corr(group['num2'])) print(corr_res)
运行输出结果:
name name1 0.993399 name2 -0.827832 name3 -0.545782 dtype: float64
注意事项
- 必须先将字符串存储的数值转为数值类型,否则相关系数计算会返回空值或报错
- 整个流程仅做一次关联和一次分组聚合,没有多余的表结构重构操作,计算效率更高
内容的提问来源于stack exchange,提问作者Cole
相关产品推荐
相关产品推荐

