tom*_*sen 3 python numpy symmetric matrix pandas
我看到了关于将嵌套的"2D"字典转换为Pandas DataFrame 的问题的答案.这将是我的问题的解决方案,但后来我想知道,我是否可以跳过生成嵌套字典的中间步骤.假设我的输入 input.txt看起来像这样:
A B 1
A C 2
B C 3
Run Code Online (Sandbox Code Playgroud)
我可以使用Pandas或Numpy将其转换为以下对称矩阵,而无需生成中间嵌套字典吗?
A B C
A 0 1 2
B 1 0 3
C 2 3 0
Run Code Online (Sandbox Code Playgroud)
我想避免创建的嵌套字典将是:
d = {'A':{'B':1,'C':2},'B':{'C':3}}
Run Code Online (Sandbox Code Playgroud)
在阅读了"使用MultiIndex读取索引"的IO Tools文档后,我尝试了这个:
import pandas as pd
df = pd.read_csv('input.txt', sep=' ', index_col=[0,1], header=None)
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,我没有获得2D热图:
import matplotlib.pyplot as plt
plt.pcolor(df)
plt.imshow()
Run Code Online (Sandbox Code Playgroud)
不确定这是否更有效率,但你可以pivot然后将帧添加到它的转置,如:
df = pd.read_csv("input.txt", header=None, delim_whitespace=True)
df = df.pivot(0,1,2)
df.add(df.T, fill_value=0).fillna(0)
A B C
A 0 1 2
B 1 0 3
C 2 3 0
Run Code Online (Sandbox Code Playgroud)
这是关于add和的文档pivot.这是正在发生的事情.第一行df = pd.read_csv("input.txt", header=None, delim_whitespace=True)返回:
0 1 2
0 A B 1
1 A C 2
2 B C 3
Run Code Online (Sandbox Code Playgroud)
然后第二行df = df.pivot(0,1,2)返回:
1 B C
0
A 1 2
B NaN 3
Run Code Online (Sandbox Code Playgroud)
神奇的数字0,1并且2是index,columns和values.index=0是用于生成新帧索引的列名.index只是pandas lingo的行名.columns=1是用于生成新框架的列的列名称.并且values=2只是用于制作新帧值的列名.
第三行df.add(df.T, fill_value=0).fillna(0)只是添加了转置以将三角矩阵转换为对称矩阵.它返回:
A B C
A 0 1 2
B 1 0 3
C 2 3 0
Run Code Online (Sandbox Code Playgroud)