如何创建一个给定3列的方形数据框/矩阵 - Python

时间:2017-12-06 21:21:29

标签: python pandas reformatting

我正在努力弄清楚如何使用像

这样的格式来开发方阵
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&#39的强制转换功能,可以更快地完成这项工作?

1 个答案:

答案 0 :(得分:8)

您可以使用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'))

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

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