Как я могу отфильтровать строки данных на основе квантильного значения столбца, используя groupby? - PullRequest
0 голосов
/ 29 ноября 2018

(Возможно, есть лучший способ задать вопрос, но, надеюсь, это описание сделает его более понятным)

Упрощенное представление моего фрейма данных с 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, начиная с_стадий_идейсов и заканчивая_стадий_идейсов, и отфильтровывать строки, в которых значение в столбце Длительность для группы превышает квантиль 0,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 голосов
/ 29 ноября 2018

Попробуйте это

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