Pandas,groupby,其中列值大于x

时间:2015-04-14 16:36:38

标签: python pandas

我有一张这样的表

    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

我正在尝试按timestampsleep idrr_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

2 个答案:

答案 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('mea‌​n')

loc调用将屏蔽lhs,以便转换结果正确对齐

要使用多个条件进行过滤,您需要对&|和{{1}使用数组比较运算符~andor另外,由于运算符优先级,您需要将条件包装在括号中:

not

答案 1 :(得分:0)

我知道这很旧,但是我想补充一点,有an official function可以做到这一点。将示例从熊猫转变为您的案例:

-1