【问题标题】:Pandas, groupby where column value is greater than xPandas,groupby,其中列值大于 x
【发布时间】:2020-03-09 19:07:50
【问题描述】:

我有一张这样的桌子

    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])

它们都返回一个 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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这里最简单的做法是先过滤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,以便转换结果正确对齐

    要使用多个条件进行过滤,您需要使用数组比较运算符&、| 和~ 分别对应and、or 和not,另外您需要将条件括在括号中由于运算符优先级:

    df2[(df2['rr_quality'] >= 150) & (df2['hr_quality'] > 200)]
    

    【讨论】:

      【解决方案2】:

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

      grouped_df2= df2.groupby([df2.index.hour,'sleep_summary_id','rr_quality'])
      grouped_df2.filter(lambda x: x['rr_quality'] > 0.)
      

      【讨论】:

        猜你喜欢
        • 2019-02-24
        • 2021-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-06
        • 2019-09-05
        • 2019-08-17
        • 1970-01-01
        相关资源
        最近更新 更多