Python 3.x 使用Python根据列值为每个组生成百分比

Python 3.x 使用Python根据列值为每个组生成百分比,python-3.x,pandas,pivot-table,aggregate-functions,pandas-groupby,Python 3.x,Pandas,Pivot Table,Aggregate Functions,Pandas Groupby,我有一个如下所示的数据帧。我想根据subject_id、hadm_id和icustay_id对它们进行分组。分组后,我想在“val_bw_80_110”列中提取pc超过1 60%的受试者。从下面的示例中,我们可以看到受试者_id=38满足此条件(val_bw_80_110=1的所有值,表示100%),我想提取属于受试者_id=38的组。如果只有两个1,那么百分比将是66.666等 我已经尝试使用groupby,但无法继续,因为我不确定如何获取列中值的百分比 data = [[38,10,110

我有一个如下所示的数据帧。我想根据subject_id、hadm_id和icustay_id对它们进行分组。分组后,我想在“val_bw_80_110”列中提取pc超过1 60%的受试者。从下面的示例中,我们可以看到受试者_id=38满足此条件(val_bw_80_110=1的所有值,表示100%),我想提取属于受试者_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%1条件的所有主题。输出数据框应该包含subject_id=38的所有记录(以及列),创建符合条件的
subject_id
布尔索引,然后使用来过滤它们

s = df.groupby(['subject_id','hadm_id','icustay_id'])['val_bw_80_110'].mean().ge(0.6)

df.loc[df.subject_id.isin(s.index.levels[0][s])]
[输出]

   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
用于获取
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
获取与原始数据帧大小相同的序列,则可能进行过滤:

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


预期的输出是什么?我认为最终的数据帧看起来如何。输出数据帧将包含subject_id=38的所有记录,因为这是唯一一个subject_id超过val_bw_80_110中1的60%限制的记录,只是试图理解这两种解决方案。你能告诉我transform('mean')的用法吗,而不是直接使用mean()你能帮我写这篇相关的文章吗?
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