我有两列的数据框,如下所示:
| 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 |
我想按两个班级计算一个统计量。结果,我期望该表的一类是行,第二类是列和交点处的值。就我而言,在class1
和class2
中可能有大量的班级人数。因此,在列中应该仅是对应类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之外,还有什么想法可以进行聚合吗?
答案 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