如何在Pandas中为已排序DataFrame添加排名前列变量的最高相关性列
问题
现有一个按rank降序排列的DataFrame:
Num score rank 0 1 1.937 6.0 0 2 1.819 5.0 0 3 1.704 4.0 0 6 1.522 3.0 0 4 1.396 2.0 0 5 1.249 1.0
同时有对应的变量相关系数矩阵:
Num1 Num2 Num3 Num4 Num5 Num6 Num1 1.0 0.976 0.758 0.045 0.137 0.084 Num2 0.976 1.0 0.749 0.061 0.154 0.096 Num3 0.758 0.749 1.0 -0.102 0.076 -0.047 Num4 0.045 0.061 -0.102 1.0 0.917 0.893 Num5 0.137 0.154 0.076 0.917 1.0 0.863 Num6 0.084 0.096 -0.047 0.893 0.863 1.0
需要给原DataFrame新增一列highestcor,展示当前变量与排名在它之前的所有变量的最高相关系数,预期结果如下:
Num score rank highestcor 0 1 1.937 6.0 NaN 0 2 1.819 5.0 0.976 0 3 1.704 4.0 0.758 0 6 1.522 3.0 0.096 0 4 1.396 2.0 0.893 0 5 1.249 1.0 0.917
请问如何高效实现这一需求?
高效实现方案
核心思路
先统一相关系数矩阵的索引/列名与原DataFrame的Num格式,再遍历原DataFrame,逐行提取当前变量与前置变量的相关系数并取最大值。
完整代码示例
import pandas as pd # 初始化原DataFrame df = pd.DataFrame({ 'Num': [1, 2, 3, 6, 4, 5], 'score': [1.937, 1.819, 1.704, 1.522, 1.396, 1.249], 'rank': [6.0, 5.0, 4.0, 3.0, 2.0, 1.0] }) # 初始化相关系数矩阵 corr_matrix = pd.DataFrame({ 'Num1': [1.0, 0.976, 0.758, 0.045, 0.137, 0.084], 'Num2': [0.976, 1.0, 0.749, 0.061, 0.154, 0.096], 'Num3': [0.758, 0.749, 1.0, -0.102, 0.076, -0.047], 'Num4': [0.045, 0.061, -0.102, 1.0, 0.917, 0.893], 'Num5': [0.137, 0.154, 0.076, 0.917, 1.0, 0.863], 'Num6': [0.084, 0.096, -0.047, 0.893, 0.863, 1.0] }, index=['Num1', 'Num2', 'Num3', 'Num4', 'Num5', 'Num6']) # 1. 统一相关矩阵的索引与列名为数值类型 corr_matrix.columns = corr_matrix.columns.str.replace('Num', '').astype(int) corr_matrix.index = corr_matrix.index.str.replace('Num', '').astype(int) # 2. 计算highestcor列 highest_cor = [] for idx, row in df.iterrows(): current_num = row['Num'] # 获取当前行之前的所有Num(原DataFrame按rank降序,前置行对应排名更高的变量) prev_nums = df.loc[:idx-1, 'Num'].tolist() if not prev_nums: highest_cor.append(pd.NA) continue # 提取当前变量与前置变量的相关系数,取最大值 max_corr = corr_matrix.loc[current_num, prev_nums].max() highest_cor.append(max_corr) df['highestcor'] = highest_cor print(df)
关键步骤说明
- 格式统一:把相关矩阵的
Num1类字符串索引/列名转为整数,和原DataFrame的Num值直接匹配,避免字符串处理的冗余; - 前置变量筛选:利用原DataFrame的排序顺序,通过
df.loc[:idx-1, 'Num']直接获取当前行之前的所有排名更高的变量; - 高效计算:遍历逻辑清晰,针对中小规模数据足够高效;若处理超大规模数据,可改用向量化操作(比如通过布尔矩阵标记前置变量,批量提取相关系数后取最大值)。
内容的提问来源于stack exchange,提问作者Victor Roos
相关产品推荐
相关产品推荐

