带有顶级元素的熊猫交叉表

时间:2020-04-01 18:54:34

标签: python pandas pivot-table

我有两列的数据框,如下所示:

| index | class1 | class2 |
|-------|--------|--------|
| 0     | a      | z      |
| 1     | a      | z      |
| 2     | a      | y      |
| 3     | b      | x      |
| 4     | b      | y      |
| 5     | b      | x      |
| 6     | c      | z      |
| 7     | c      | z      |
| 8     | c      | x      |

我想按两个班级计算一个统计量。结果,我期望该表的一类是行,第二类是列和交点处的值。就我而言,在class1class2中可能有大量的班级人数。因此,在列中应该仅是对应类1顶部的class2对象

作为示例输出:

|   | a    |   | b    |   | c    |
|---|------|---|------|---|------|
| x | 0    |   | 0.33 |   | 0.33 |
|   |      |   |      |   |      |
| y | 0.33 |   | 0.33 |   | 0    |
|   |      |   |      |   |      |
| z | 0.66 |   | 0.33 |   | 0.66 |

我喜欢使用crosstab func来完成这些操作:

pd.crosstab(index=df['class1'],
            columns=df['class2'],
            normalize='index')

问题:

如何仅保留所有class1类中的顶级class2类?除了croostab之外,还有什么想法可以进行聚合吗?

1 个答案:

答案 0 :(得分:0)

您快到了,您不想对index而不是columns进行标准化:

dfn = pd.crosstab(index=df['class2'],
                  columns=df['class1'],
                  normalize='columns').round(2)

print(dfn)
class1     a     b     c
class2                  
x       0.00  0.67  0.33
y       0.33  0.33  0.00
z       0.67  0.00  0.67

要删除索引和列名:

dfn = (pd.crosstab(index=df['class2'],
                   columns=df['class1'],
                   normalize='columns')
       .round(2)
       .rename_axis(None)
       .rename_axis(None, axis=1)
      )
print(dfn)
      a     b     c
x  0.00  0.67  0.33
y  0.33  0.33  0.00
z  0.67  0.00  0.67