如何使用自定义函数计算单DataFrame列两两值生成对应矩阵
生成与相关矩阵结构完全对齐的自定义列计算方阵
核心匹配规则
要让输出结构和pandas内置相关矩阵(.corr()的输出)完全一致,只需要满足两个要求:
- 输出为二维方阵,行索引、列索引完全复用原DataFrame的列名,不做任何修改
- 每个矩阵位置
(i,j)的取值,就是传入第i列和第j列给calc_func计算得到的标量结果,不做任何维度偏移
如果原DataFrame总共有937列,最终输出的矩阵维度就会严格为(937,937)。
实现步骤
1. 定义你的自定义计算函数
保证函数入参形式严格匹配要求:两个pandas Series(对应传入的两列数据),返回单个浮点数作为计算结果,计算过程不引入行维度的额外逻辑。
import pandas as pd import numpy as np # 替换为你自己的calc_func逻辑即可,入参格式不要改动 def calc_func(col1: pd.Series, col2: pd.Series) -> float: # 举个占位示例:计算两列对应位置的欧氏距离,你可以换成自己的计算逻辑 return np.sqrt(np.sum((col1 - col2)**2))
2. 生成和相关矩阵结构完全一致的结果矩阵
完全按照pandas相关系数的遍历逻辑实现,避免结构错位:
# 提取原数据所有列名,和corr()输出的索引/列名完全对齐 all_cols = df.columns # 初始化和列数等长的空方阵 custom_corr_like = pd.DataFrame( index=all_cols, columns=all_cols, dtype=np.float64 ) # 逐列遍历计算两两结果 for current_col in all_cols: # 计算当前列和所有其他列的calc_func值 custom_corr_like[current_col] = df.apply( lambda target_col: calc_func(current_col, target_col), axis=0 )
运行完之后,你可以直接用custom_corr_like.shape校验,输出就是原列数对应的方阵规模,和直接调用df.corr()得到的输出形状、索引、列名完全一致。
性能优化说明
如果你的calc_func计算结果是对称的(即calc_func(a,b) == calc_func(b,a)),可以只计算方阵上三角区域的结果,再镜像填充到下三角,能把整体计算量压缩一半,不影响最终输出结构:
for idx_i, col_i in enumerate(all_cols): for idx_j in range(idx_i, len(all_cols)): col_j = all_cols[idx_j] calc_result = calc_func(col_i, col_j) # 对称位置填充相同值 custom_corr_like.iloc[idx_i, idx_j] = calc_result custom_corr_like.iloc[idx_j, idx_i] = calc_result
注意:你提供的样本数据带有多层级列名(比如
Reporter ISO作为顶层列名的结构),不需要手动拆解列名,直接把整个DataFrame传入上述逻辑即可,多层列名会自动作为方阵的索引和列名,和pandas相关矩阵对多层列的处理逻辑完全一致。
内容的提问来源于stack exchange,提问作者Uldana Duisenaly
相关产品推荐
相关产品推荐

