You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将对称配对的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:36:25