df.groupby()-如何在分组数据的顺序很重要的地方聚合数据?

时间:2019-04-02 09:06:57

标签: python pandas dataframe aggregate pandas-groupby

当分组数据的顺序很重要时,如何聚合数据?(如果可以用一种优雅的矢量化方法来完成,则可以得到加分)。如果这很明显,让我举个例子来解释。


假设我在df中有数据:

id    month              value
------------------------------
001   2019-01-01 (Jan)     111
001   2019-02-01 (Feb)     222
001   2019-03-01 (Mar)     333

002   2019-01-01 (Jan)       0
002   2019-02-01 (Feb)       0
002   2019-03-01 (Mar)      25

...   ...                  ...

999   2019-01-01 (Jan)     800
999   2019-02-01 (Feb)     600
999   2019-03-01 (Mar)     400

我可以使用groupby来汇总每个id上的数据:

df.groupby('id')['value'].agg([numpy.sum, numpy.mean])

是否使用numpy.sumnumpy.meannumpy.max等作为聚合函数,分组的孤立数组的顺序无关紧要(例如{{1 }} [111, 222, 333])-结果将始终相同。


但是,有些聚合对顺序很重要-例如,我可能要计算:

  • 加权平均值(例如,如果最新值的权重更大)
  • 从头到尾的更改(例如id=001-Mar

当前,我遍历每个Jan,然后:

  1. 通过id过滤数据
  2. 获取月值元组列表,例如df[df['id']==id]
  3. 基于每个元组的第一个元素(即[(Jan,111), (Feb,222), (Mar,333)]
  4. )进行排序
  5. 进行汇总

例如,如果我只想查找排序数组的第一个元素与最后一个元素之间的差异,那么我将得出以下结论:

'month'

当分组数据的顺序很重要时,如何汇总数据?

我能否通过使用矢量化而不是遍历每个id finish_minus_start ------------------------ 001 222 002 25 ... ... 999 -400 来更有效地做到这一点?

1 个答案:

答案 0 :(得分:0)

我希望这是您想要的。 您可以使用聚合并设置自己的函数。我从两个链接中举了一个例子 Summarizing and Grouping dataFirst and Last Functions并玩了一点。

df= df.set_index('date')
aggregations = {
    'value': lambda x: x.loc[x.index.max()] - x.loc[x.index.min()]
}
print(df.groupby('id').agg(aggregations))