13

来自 Pandas 新手:我的数据基本上看起来像这样 -

 data1=pd.DataFrame({'Dir':['E','E','W','W','E','W','W','E'], 'Bool':['Y','N','Y','N','Y','N','Y','N'], 'Data':[4,5,6,7,8,9,10,11]}, index=pd.DatetimeIndex(['12/30/2000','12/30/2000','12/30/2000','1/2/2001','1/3/2001','1/3/2001','12/30/2000','12/30/2000']))
data1
Out[1]: 
           Bool  Data Dir
2000-12-30    Y     4   E
2000-12-30    N     5   E
2000-12-30    Y     6   W
2001-01-02    N     7   W
2001-01-03    Y     8   E
2001-01-03    N     9   W
2000-12-30    Y    10   W
2000-12-30    N    11   E

我想按多个级别对其进行分组,然后执行 cumsum():

例如,像running_sum=data1.groupby(['Bool','Dir']).cumsum()<-(不起作用)

输出类似于:

Bool Dir Date        running_sum
N    E   2000-12-30           16
     W   2001-01-02            7
         2001-01-03           16
Y    E   2000-12-30            4
         2001-01-03           12
     W   2000-12-30           16

我的“喜欢”代码显然还没有接近。我做了很多尝试,并学到了很多关于如何不这样做的新知识。

谢谢你提供的所有帮助。

4

2 回答 2

15

试试这个:

data2 = data1.reset_index()
data3 = data2.set_index(["Bool", "Dir", "index"])   # index is the new column created by reset_index
running_sum = data3.groupby(level=[0,1,2]).sum().groupby(level=[0,1]).cumsum()

您不能简单地使用cumsumon的原因data3与您的数据结构有关。Bool按and分组Dir 并应用聚合函数(sum,mean等)将产生一个比您开始时更小的 DataFrame,因为您使用的任何函数都会根据您的组键聚合值。然而cumsum,它不是一个聚合函数。它将返回一个与调用它的 DataFrame 大小相同的 DataFrame。因此,除非您的输入 DataFrame 的格式在调用后输出可以是相同的大小cumsum,否则它将引发错误。这就是为什么我sum首先调用它,它以正确的输入格式返回一个 DataFrame。

抱歉,如果我解释得不够好。也许其他人可以帮助我?

于 2013-04-02T04:30:29.847 回答
9

正如另一个答案指出的那样,您试图将相同的日期折叠成单行,而 cumsum 函数将返回与原始 DataFrame 长度相同的一系列。换句话说,您实际上想按 [Bool, Dir, Date] 分组,计算每个组的总和,然后返回按 [Bool, Dir] 分组的行的累积和。另一个答案是对您的特定问题的完全有效的解决方案,这是一个单行变体:

data1.groupby(['Bool', 'Dir', 'Date']).sum().groupby(level=[0, 1]).cumsum()

这将完全以请求的格式返回输出。

对于那些在 Pandas 组中寻找简单 cumsum 的人,您可以使用:

data1.groupby(['Bool', 'Dir']).apply(lambda x: x['Data'].cumsum())

累积总和是在每个组内部计算的。这是输出的样子:

Bool  Dir            
N     E    2000-12-30     5
           2000-12-30    16
      W    2001-01-02     7
           2001-01-03    16
Y     E    2000-12-30     4
           2001-01-03    12
      W    2000-12-30     6
           2000-12-30    16
Name: Data, dtype: int64

请注意重复的日期,但这是对 Bool 和 Dir 列标识的每个组的行内部进行严格的累积求和。

于 2014-09-11T23:09:13.970 回答