[英]Pandas groupby where the column value is greater than the group's x percentile
[英]Pandas, groupby where column value is greater than x
我有一张这样的桌子
timestamp avg_hr hr_quality avg_rr rr_quality activity sleep_summary_id
1422404668 66 229 0 0 13 78
1422404670 64 223 0 0 20 78
1422404672 64 216 0 0 11 78
1422404674 66 198 0 40 9 78
1422404676 65 184 0 30 3 78
1422404678 64 173 0 10 17 78
1422404680 66 199 0 20 118 78
我正在尝试按timestamp
、 sleep id
和rr_quality
对数据进行rr_quality
,其中rr_quality
> 0
我尝试了以下方法,但似乎都不起作用
df3 = df2.groupby([df2.index.hour,'sleep_summary_id',df2['rr_quality']>0])
df3 = df2.groupby([df2.index.hour,'sleep_summary_id','rr_quality'>0])
df3 = df2.groupby([df2.index.hour,'sleep_summary_id',['rr_quality']>0])
他们都返回一个keyerror。
编辑:
似乎也不能一次通过多个过滤器。 我尝试了以下方法:
df2[df2['rr_quality'] >= 150, df2['hr_quality'] > 200]
df2[df2['rr_quality'] >= 150, ['hr_quality'] > 200]
df2[[df2['rr_quality'] >= 150, ['hr_quality'] > 200]]
返回: TypeError: 'Series' objects are mutable, thus they cannot be hashed
这里要做的最简单的事情是先过滤 df,然后执行 groupby:
df2[df2['rr_quality'] > 0].groupby([df2.index.hour,'sleep_summary_id'])
编辑
如果您打算将其分配回原始 df:
df2.loc[df2['rr_quality'] > 0, 'AVG_HR'] = df2[df2['rr_quality'] >= 150].groupby([df2.index.hour,'emfit_sleep_summary_id'])['avg_hr'].transform('mean')
loc
调用将屏蔽 lhs,以便转换的结果正确对齐
要使用多个条件进行过滤,您需要使用数组比较运算符&
, |
和~
for and
, or
和not
,另外,由于运算符优先级,您还需要将条件括在括号中:
df2[(df2['rr_quality'] >= 150) & (df2['hr_quality'] > 200)]
我知道这很旧,但我想补充一点,有一个官方功能可以做到这一点。 将示例从熊猫转换为您的案例:
grouped_df2= df2.groupby([df2.index.hour,'sleep_summary_id','rr_quality'])
grouped_df2.filter(lambda x: x['rr_quality'] > 0.)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.