如何使用groupby根据列的分位数来过滤数据帧行?

时间:2018-11-28 23:43:18

标签: pandas filter pandas-groupby quantile

(提出问题的方法可能更好,但希望此描述会使其更清楚)

我的数据框的简化视图(显示10条随机行)是:

      Duration  starting_station_id  ending_station_id
5163         420                 3077               3018
113379       240                 3019               3056
9730         240                 3047               3074
104058       900                 3034               3042
93110        240                 3055               3029
93144        240                 3016               3014
48999        780                 3005               3024
30905        360                 3019               3025
88132        300                 3022               3048
12673        240                 3075               3031

我想做的是groupby starting_station_id和ending_station_id,并过滤出行的“持续时间”列中的值低于.99分位数的行。

要做分组和分位数计算,我要做:

df.groupby( ['starting_station_id', 'ending_station_id'] )[ 'Duration' ].quantile([.99])

,部分输出为:

3005                 3006               0.99     3825.6
                     3007               0.99     1134.0
                     3008               0.99     5968.8
                     3009               0.99     9420.0
                     3010               0.99     1740.0
                     3011               0.99    41856.0
                     3014               0.99    22629.6
                     3016               0.99     1793.4
                     3018               0.99    37466.4

我相信这告诉我,对于组(3005,3006),值> = 3825.6落入.99分位数。因此,我想过滤出该组的持续时间值大于等于3825.6的行。 (然后对所有其他组执行相同的操作)

最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

尝试一下

 thresholds = df.groupby(['start', 'end'])['x'].quantile(.99)
 mask = (df.Duration.values > thresholds[[(x, y) for x, y in zip(df.start, df.end)]]).values
 out = df[mask]