如何在给定 3 列的情况下创建正方形 dataframe/matrix - Python

How to create a square dataframe/matrix given 3 columns - Python

我正在努力弄清楚如何在给定

这样的格式的情况下开发方阵
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 循环时,它都必须从头开始遍历每个值的每一列和每一行。我觉得我绝对是在这里重新发明轮子。鉴于有多少列和行,这对于我的数据集也不现实。 python 中是否有类似于 R 的 cast 函数的东西可以更快地完成此操作?

你可以使用 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 和其他重塑方法的更多信息,请参阅 the docs


或者,您可以使用 pd.crosstab:

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

与期望每个 (a1, a2) 对都是唯一的 df.pivot 不同,pd.crosstab (with agfunc='sum') 将通过对关联的求和来聚合重复对 值。尽管您发布的示例中没有重复对,但指定 当 values 时,需要如何聚合重复项 使用参数。

此外,虽然 df.pivot 传递了列标签,但 pd.crosstab 传递了 类数组(例如 df 的整列)。 df.iloc[:, i] 是第 idf.