Pandas groupby在一列上,然后根据另一列

时间:2017-12-05 21:12:23

标签: pandas

我正在尝试将数据过滤到任何给定日期的数据底部十分位数中的那些行。因此,我需要首先将日期分组以获取数据的子宇宙,然后从那里将相同的子宇宙过滤到仅落入最低十分位数的那些值。然后,我需要将所有不同的日期聚合在一起,以生成一个大型数据帧。

例如,我想采用以下df:

df = pd.DataFrame([['2017-01-01', 1], ['2017-01-01', 5], ['2017-01-01', 10], ['2018-01-01', 5], ['2018-01-01', 10]], columns=['date', 'value'])

并且只有那个值在该日期的底部十分位数的行(分别低于1.8和5.5):

       date       value
0  '2017-01-01'     1
1  '2018-01-01'     5

我可以使用df.groupby(['date'], 'value'].quantile(.1)获得一系列底部十分位数,但这需要我遍历整个df并将该值与系列中的分位数值进行比较,我试图避免由于性能问题。

1 个答案:

答案 0 :(得分:1)

这样的东西?

df.groupby('date').value.apply(lambda x: x[x < x.quantile(.1)]).reset_index(1,drop = True).reset_index()

    date        value
0   2017-01-01      1
1   2018-01-01      5

编辑:

df.loc[df['value'] < df.groupby('date').value.transform(lambda x: x.quantile(.1))]