如何将对称配对的Pandas DataFrame转换为透视表?
解决对称配对的Pandas透视表转换问题
没问题,这事儿用Pandas完全能搞定,我给你一步步拆解实现:
第一步:补全对称配对数据
你的原始small_df只存了单向的配对(比如a-b但没b-a),首先我们要把这些对称的配对补进去:
import pandas as pd # 假设你已经得到了small_df,先复制一份并交换Col1和Col2 symmetric_df = small_df.copy() symmetric_df[['Col1', 'Col2']] = symmetric_df[['Col2', 'Col1']] # 把原数据和对称数据合并 combined_df = pd.concat([small_df, symmetric_df], ignore_index=True)
第二步:添加自身配对的0值
接下来要补充每个元素和自身对比的行,值设为0:
# 获取所有参与比较的唯一元素 unique_items = pd.unique(combined_df[['Col1', 'Col2']].values.ravel('K')) # 生成自身配对的DataFrame self_pairs = pd.DataFrame({ 'Col1': unique_items, 'Col2': unique_items, 'Col3': 0 }) # 合并到之前的数据集里 final_df = pd.concat([combined_df, self_pairs], ignore_index=True)
第三步:生成目标透视表
现在就可以直接生成完整的对称矩阵了:
# 生成完整形式的透视表 full_pivot = final_df.pivot(index='Col1', columns='Col2', values='Col3') print(full_pivot)
输出结果就是你要的完整对称矩阵:
Col2 a b c d Col1 a 0 2 3 4 b 2 0 5 6 c 3 5 0 7 d 4 6 7 0
如果想要上三角/下三角形式,只需要用numpy的矩阵工具过滤就行:
上三角形式(含对角线)
import numpy as np upper_tri_pivot = full_pivot.where(np.triu(np.ones(full_pivot.shape)).astype(bool)) print(upper_tri_pivot)
输出:
Col2 a b c d Col1 a 0.0 2.0 3.0 4.0 b NaN 0.0 5.0 6.0 c NaN NaN 0.0 7.0 d NaN NaN NaN 0.0
下三角形式(含对角线)
lower_tri_pivot = full_pivot.where(np.tril(np.ones(full_pivot.shape)).astype(bool)) print(lower_tri_pivot)
输出:
Col2 a b c d Col1 a 0.0 NaN NaN NaN b 2.0 0.0 NaN NaN c 3.0 5.0 0.0 NaN d 4.0 6.0 7.0 0.0
补充说明
因为你的原始数据是对称的(a-b和b-a的值相同),所以合并后不会出现同一配对重复且值冲突的情况,pivot方法会自动正确取值。如果遇到值冲突的情况,可以用pivot_table并指定aggfunc(比如mean)来处理。
内容的提问来源于stack exchange,提问作者lcb
相关产品推荐
相关产品推荐

