【发布时间】:2019-08-23 13:11:56
【问题描述】:
当分组数据的顺序很重要时,我如何聚合数据?(如果可以以优雅的矢量化方式完成,则可以加分)。如果这很清楚,让我用一个例子来解释。
假设我在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.sum、numpy.mean、numpy.max等作为聚合函数,分组的孤立数组的顺序都没有关系(例如[111, 222, 333]代表id=001)-结果总是一样的。
但是,有些聚合的顺序确实很重要 - 例如,我可能想要计算:
- 加权平均值(例如,如果较新的值具有更大的权重)
- 从头到尾的更改(例如,
Mar-Jan) - 等
目前,我遍历每个id,然后:
- 通过
df[df['id']==id]过滤数据 - 获取月份值元组的列表,例如
[(Jan,111), (Feb,222), (Mar,333)] - 根据每个元组的第一个元素对列表进行排序,即
'month' - 执行聚合
例如,如果我只想找到 该排序数组的第一个元素和最后一个元素之间的差异,那么我会得到以下结果:
id finish_minus_start
------------------------
001 222
002 25
... ...
999 -400
当分组数据的顺序很重要时,如何聚合数据?
我可以通过使用矢量化而不是循环遍历每个id 来更有效地做到这一点吗?
【问题讨论】:
-
也许这个解决方案有帮助:stackoverflow.com/questions/25995771/… 它计算一个先前的顺序来重新排列分组
-
@BCJuan - 谢谢 - 这看起来很有用。该解决方案将订购
df,这样对于每个id,行将按'month'排序。好的开始。但是你能确认在这个排序的df上进行聚合时,这些行的顺序反映在传递给聚合函数的值中(例如,numpy.mean(x))吗?即,由于某种我无法理解的原因,孤立的值不会在幕后摇摆不定。 -
df.groupby('id').apply(lambda x: x.sort_values('month'))这样的东西怎么样? -
我猜矢量化函数只适用于最常见的操作,对于其余的,我们必须使用:
df.groupby('id').apply(lambda x: User_Defined_function(x)) -
@hacker315 - 你能再明确一点吗,因为我很难找到解决方案!假设我希望我的用户定义函数为
difference_between_first_and_last_elements(),我将如何定义该函数以为每个id返回单个值?即sorted_list[-1] - sorted_list[0].
标签: python pandas dataframe aggregate pandas-groupby