我有一张这样的表
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
为> 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])
所有这些都会返回一个关键错误。
修改
似乎也无法一次传递多个过滤器。 我尝试了以下方法:
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
答案 0 :(得分:7)
这里最简单的方法是首先过滤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,以便转换结果正确对齐
要使用多个条件进行过滤,您需要对&
,|
和{{1}使用数组比较运算符~
,and
和or
另外,由于运算符优先级,您需要将条件包装在括号中:
not
答案 1 :(得分:0)
我知道这很旧,但是我想补充一点,有an official function可以做到这一点。将示例从熊猫转变为您的案例:
-1