带有顶部元素的交叉表

2024-10-01 04:46:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我的dataframe有两列,如下所示:

| 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中应该只有tops类2对象

作为示例输出:

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

我喜欢使用crosstabfunc执行这些操作:

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

问题是:

如何让所有的一班学生只留下最好的二班?除了croostab之外,还有什么方法可以聚合吗


Tags: 对象示例dataframedfindex例子统计数据pd
1条回答
网友
1楼 · 发布于 2024-10-01 04:46:42

您就快到了,您不想对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

相关问题 更多 >