python-3.x - 使用 Python pandas 根据列值生成每个组的百分比
问题描述
我有一个如下所示的数据框。我想根据 subject_id、hadm_id 和 icusstay_id 对它们进行分组。一旦我对它进行分组,我想在“val_bw_80_110”列中提取超过 60% 个 1 的主题。从下面的例子中,我们可以看到 subject_id = 38 满足这个条件(val_bw_80_110 的所有值 = 1,这意味着 100%),我想提取属于 subject_id = 38 的组。如果只有两个 1那么百分比将是 66.666 等
我已经尝试过使用 groupby 但无法继续进行,因为我不确定如何获取列中值的百分比
data = [[38,10,110,1,0,0], [38,10,110,1,0,0],[38,10,110,1,0,0],
[28,11,120,1,0,0],[28,11,120,0,1,0],[28,11,120,0,0,1],
[48,13,130,1,0,0],[48,13,130,0,1,0],[48,13,130,0,0,1]]
df = pd.DataFrame(data, columns =['subject_id','hadm_id','icustay_id',
'val_bw_80_110','val_lt_80','val_gt_110'])
new_df = df.groupby(['subject_id','hadm_id','icustay_id'])
我的预期结果只是一个数据框,其中包含满足 val_bw_80_110 中 60% 的条件的所有主题。输出数据框应包含 subject_id = 38 的所有记录(以及列)
解决方案
使用boolean indexing
withGroupBy.transform
获取1
值的百分比:
df1 = (df[df.groupby(['subject_id','hadm_id','icustay_id'])['val_bw_80_110']
.transform('mean').ge(0.6)])
print (df1)
subject_id hadm_id icustay_id val_bw_80_110 val_lt_80 val_gt_110
0 38 10 110 1 0 0
1 38 10 110 1 0 0
2 38 10 110 1 0 0
如果使用transform
与原始 DataFrame 相同大小的 get Series,则可以进行过滤:
print (df.groupby(['subject_id','hadm_id','icustay_id'])['val_bw_80_110']
.transform('mean'))
0 1.000000
1 1.000000
2 1.000000
3 0.333333
4 0.333333
5 0.333333
6 0.333333
7 0.333333
8 0.333333
Name: val_bw_80_110, dtype: float64
print (df.groupby(['subject_id','hadm_id','icustay_id'])['val_bw_80_110']
.transform('mean').ge(0.6))
0 True
1 True
2 True
3 False
4 False
5 False
6 False
7 False
8 False
Name: val_bw_80_110, dtype: bool
推荐阅读
- python - 字符串变量的 Python3 可变性
- git - 如何在 github 操作中运行 git diff
- java - Java8 Lambda 函数分配异常
- javascript - 具有动态列范围的 Google 脚本中的第一个空行
- wordpress - bitnami/WordPress 图表 - 在自定义图像中嵌入上传
- python - 如果值相同,切片会给出不正确的结果
- installation - 如何在 Cygwin 上安装和使用 Lex?
- android - 自定义 SwipeToRefresh 移动 RecyclerView Android 嵌套滚动
- scrapy - 如何在response.css中正确定义和scrapy中的yield
- r - 使用 ggplot2 为 R 中的离散变量创建小提琴图、宇宙飞船图或类似的东西