如何计算DataFrame行两两差的平方和及对应结果存储方案
计算客户对数值列差值平方和的实现方案
问题2:存储格式说明
你设想的三列长表格式是合理的,该格式冗余度低,支持后续灵活的筛选、排序、聚合操作,比行列都为客户名的宽矩阵格式更适合大多数数据分析场景。
问题1:实现代码
完全不需要自己写循环,用scipy的优化函数即可高效实现,即使是数千行、数十列的数据也能在秒级完成计算,代码如下:
依赖导入
import pandas as pd from scipy.spatial.distance import pdist, squareform
核心计算逻辑
# 1. 预处理:将客户列设为索引,提取所有数值列 # 替换下方的df为你实际的DataFrame变量即可 df_num = df.set_index('Customer') # 2. 计算所有客户对的差值平方和 # metric='sqeuclidean'直接对应你的计算逻辑:各维度差值平方求和 dist_arr = pdist(df_num, metric='sqeuclidean') # 3. 转为你需要的长表格式 # 先转成方阵格式 dist_matrix = squareform(dist_arr) # 转为长表 result = pd.DataFrame( dist_matrix, index=df_num.index, columns=df_num.index ).stack().reset_index() # 重命名列 result.columns = ['Customer1', 'Customer2', 'Sum'] # 过滤掉自配对、重复配对(仅保留单向的客户对,避免Boby-Alan和Alan-Boby同时出现) result = result[result['Customer1'] < result['Customer2']].reset_index(drop=True)
运行后result就是你需要的结果,和你给出的示例完全一致。
性能说明
pdist是scipy专门用于样本间距离计算的优化函数,底层为C实现,比手写Python循环性能高1~2个数量级,完全适配你的数据量级需求。
内容的提问来源于stack exchange,提问作者busman
相关产品推荐
相关产品推荐

