如何使用Python创建一个由三列组成的方形数据框/矩阵

14

我很难弄清楚如何根据给定的格式开发一个方阵。

a a 0
a b 3
a c 4
a d 12
b a 3 
b b 0
b c 2
...

翻译为:

转换为类似以下的内容:
  a b c d e
a 0 3 4 12 ... 
b 3 0 2 7 ... 
c 4 3 0 .. .
d 12 ...  
e . .. 
在pandas中,我开发了一种方法,我认为它有效,但运行时间太长,因为它必须每次从头开始迭代每个值的每个列和行,使用for循环。我觉得我肯定在重新发明轮子。考虑到我的数据集有很多列和行,这也不现实。是否有类似于R的cast函数的东西可在python中更快地完成此操作?
1个回答

21

您可以使用df.pivot

import pandas as pd

df = pd.DataFrame([['a', 'a', 0],
                   ['a', 'b', 3],
                   ['a', 'c', 4],
                   ['a', 'd', 12],
                   ['b', 'a', 3],
                   ['b', 'b', 0],
                   ['b', 'c', 2]], columns=['X','Y','Z'])

print(df.pivot(index='X', columns='Y', values='Z'))
产生的结果
Y    a    b    c     d
X                     
a  0.0  3.0  4.0  12.0
b  3.0  0.0  2.0   NaN

在这里,index='X'告诉df.pivot将标记为'X'的列用作索引,columns='Y'则告诉它将标记为'Y'的列用作列索引。

有关pivot和其他重塑方法的更多信息,请参见文档


或者,您可以使用pd.crosstab

print(pd.crosstab(index=df.iloc[:,0], columns=df.iloc[:,1], 
                  values=df.iloc[:,2], aggfunc='sum'))

df.pivot 要求每个 (a1, a2) 组合唯一不同,pd.crosstab (使用 agfunc='sum')将通过加总相关值来聚合重复的组合。 虽然在您发布的示例中没有重复的组合,但在使用 values 参数时需要指定如何聚合重复项。

而且,df.pivot 需要传递列标签,而 pd.crosstab 需要传递 类似数组的东西(例如整列数据框 df)。df.iloc[:, i]df 的第 i 列。


给定原始DF,对于那些还不熟悉pandas语法的人来说,答案可能会令人困惑。在df.pivot内给定的参数是原始df列的名称,而不是索引。因此,请确保将其解读为“名为'0'的列作为索引”,而不是“第一(0th)列是索引”。 - Jeff Ellen
@JeffEllen: 很好的建议。我已经进行了编辑,希望能够更加明确。 - unutbu

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