3

我看到了一个关于将嵌套的“2D”字典转换为 Pandas DataFrame 的问题的答案。那将是我的问题的解决方案,但后来我想知道,我是否可以跳过生成嵌套字典的中间步骤。假设我的输入 input.txt如下所示:

A B 1
A C 2
B C 3

我可以使用 Pandas 或 Numpy 将其转换为以下对称矩阵,而无需生成中间嵌套字典吗?

  A B C
A 0 1 2
B 1 0 3
C 2 3 0

我想避免创建的嵌套字典是:

d = {'A':{'B':1,'C':2},'B':{'C':3}}

在阅读了有关“使用 MultiIndex 读取索引”的 IO 工具文档后,我尝试了此操作:

import pandas as pd
df = pd.read_csv('input.txt', sep=' ', index_col=[0,1], header=None)

但是当我这样做时,我没有得到 2D 热图:

import matplotlib.pyplot as plt
plt.pcolor(df)
plt.imshow()
4

1 回答 1

7

不确定这是否更有效,但是您可以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

这是关于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

然后第二行df = df.pivot(0,1,2)返回:

1   B   C
0           
A   1   2
B NaN   3

神奇的数字0和是1和。是用于创建新框架索引的列名。只是用于行名的熊猫行话。是用于制作新框架的列的列名。并且只是用于制作新框架值的列名。2indexcolumnsvaluesindex=0indexcolumns=1values=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
于 2015-05-12T17:14:04.153 回答