(提出问题的方法可能更好,但希望此描述会使其更清楚)
我的数据框的简化视图(显示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的行。 (然后对所有其他组执行相同的操作)
最好的方法是什么?
答案 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]