11

我正在努力弄清楚如何在给定格式的情况下开发方阵

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

在熊猫。我开发了一种我认为可行但需要永远运行的方法,因为它必须每次使用 for 循环从头开始迭代每个值的每一列和每一行。我觉得我肯定在这里重新发明轮子。考虑到有多少列和行,这对于我的数据集也是不现实的。是否有类似于 R 在 python 中的 cast 函数可以更快地执行此操作?

4

1 回答 1

18

你可以使用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 (with agfunc='sum') 将通过对相关值求和来聚合重复的对。values 尽管在您发布的示例中没有重复对,但是在使用参数时需要指定应该如何聚合重复项。

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

于 2017-12-06T21:24:19.467 回答