Python Pandas - 将“1D”文件转换为2D数组

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}}

在阅读有关IO工具文档中“使用MultiIndex读取索引”后,我尝试了这个方法:

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()

不要在你的问题中解释被接受的答案,你可以编辑或建议编辑DSM的答案,并将解释放在答案本身中。 - Tim
马上就会做,@tim-castelijns。感谢您教给我这个过程。 - tommy.carstensen
没关系。这只是更适合问答格式。 - Tim
在哪里?同时编辑时无需写EDIT: - Tim
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

这里是关于 addpivot的文档。以下是相关步骤。第一行代码 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

魔术数字012分别代表indexcolumnsvalues。其中,index=0表示新框架的索引使用的列名,index是指pandas中的行名。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

谢谢你成为第一个向我展示学习 Pandas 的重要性的人。非常抱歉没有立即为你的回答投票,但我必须先阅读文档以理解你回答中的 df.pivot(0,1,2) 部分。 - tommy.carstensen
这不是很高效,但只有三行代码,对我来说很重要,因为这是我在非洲为一门课程做的一个实践,参与者几乎没有编程经验。非常感激。谢谢。 - tommy.carstensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接