如何将Pandas DataFrame转换为类相关矩阵的对称方阵?
问题描述
现有如下结构的DataFrame:
name1 name2 value 0 A B 1300 1 A C 150 2 A D 300 3 B C 450 4 B D 200 5 C D 300
尝试用pivot方法转换表格,代码如下:
table = df.pivot(columns='name1', index='name2', values='value')
得到的结果是:
name1 A B C name2 B 1300.0 NaN NaN C 150.0 450.0 NaN D 300.0 200.0 300.0
需要生成一个包含A-D作为行和列的对称方阵,要求name1与name2的对应值和name2与name1的对应值相等(例如A/B和B/A都为1300),期望输出如下:
A B C D A NaN 1300.0 150.0 300.0 B 1300.0 NaN 450.0 200.0 C 150.0 450.0 NaN 300.0 D 300.0 200.0 300.0 NaN
可复现输入代码:
import pandas as pd products_list = [['A', 'B', 1300], ['A', 'C', 150], ['A', 'D', 300], ['B', 'C', 450], ['B', 'D', 200], ['C', 'D', 300]] df = pd.DataFrame(products_list, columns=['name1', 'name2', 'value'])
解决方案
方法一:构造对称数据集后再透视
先把原始数据的name1和name2互换,生成对称记录并合并到原数据中,最后透视得到对称方阵:
# 复制原数据并交换name1和name2列 df_reversed = df.copy() df_reversed[['name1', 'name2']] = df_reversed[['name2', 'name1']] # 合并原数据和反转后的数据 df_sym = pd.concat([df, df_reversed], ignore_index=True) # 透视得到对称表格 table = df_sym.pivot(columns='name1', index='name2', values='value') # 调整行和列的顺序为A-D table = table.reindex(index=['A', 'B', 'C', 'D'], columns=['A', 'B', 'C', 'D']) # 将对角线设置为NaN(原数据无自身对应值) import numpy as np np.fill_diagonal(table.values, np.nan) print(table)
方法二:基于初始透视表填充对称值
如果不想修改原始数据集,可以先得到初始透视表,再通过转置填充对称位置的缺失值:
# 先执行原透视操作 table = df.pivot(columns='name1', index='name2', values='value') # 用转置后的表格填充原表格的缺失值,得到对称结构 sym_table = table.combine_first(table.T) # 调整行和列的顺序为A-D sym_table = sym_table.reindex(index=['A', 'B', 'C', 'D'], columns=['A', 'B', 'C', 'D']) # 将对角线设置为NaN import numpy as np np.fill_diagonal(sym_table.values, np.nan) print(sym_table)
两种方法都能生成符合要求的对称方阵,适合后续绘制热力图。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

