python - 每个类别的分数计数
问题描述
我有一个类似的数据框
ID category fraction_0 fraction 1
A 1 1/3 2/3
A 1 1/3 2/3
A 0 1/3 2/3
C 1 0/1 1/1
B 0 1/1 0/1
fraction_0 和 fraction_1 是输出。fraction_0 是按 ID 分组的,在 ID A 中,类别中有多少是 0。以 A 为例,在 3 个 A 中,有 1 个 0 和 2 个 1。所以 fraction_0 是 1/3,fraction_1 是 2/3。
我的代码如下所示
df.groupby('ID')['category'].agg(lamda x: x/x.sum())
但是,这段代码并不能帮助我对 0 和 1 进行分类。有人知道如何解决这个问题吗?
解决方案
使用groupby
+ value_counts
withnormalize=True
来获取分数。然后我们需要重新整形并将merge
结果恢复到原来的样子。
res = (df.groupby('ID')['category'] # For category within each ID
.value_counts(normalize=True) # Calculate %
.unstack(-1) # Each category to a column
.fillna(0) # No occurrences -> 0%
.add_prefix('fraction_')) # Modify column names
df = df.merge(res, on='ID', how='left')
ID category fraction_0 fraction_1
0 A 1 0.333333 0.666667
1 A 1 0.333333 0.666667
2 A 0 0.333333 0.666667
3 C 1 0.000000 1.000000
4 B 0 1.000000 0.000000
推荐阅读
- swift - 为什么在检测到 SpriteKit 中的碰撞时转换 SKSpriteNode 有时无法正常工作并引发错误
- linux - 在不同虚拟机上的脚本中调用多个 shell 脚本
- mysql - 使用 mySQL 查询 3 个不同的表
- php - PHP Sql导入不起作用
- java - 使用 sharedpreference 将用户名放入其他活动
- idl-programming-language - 在 IDL 中用最少的代码制作数组矩阵
- javascript - javascript encodeURIComponent 和转义?
- java - Spring Webflux 或非阻塞模式不能不利于扩展
- c# - 使用 foreach 获取变换的父/子游戏对象时出错
- python - 时间序列数据框熊猫中的多天明智图