【问题标题】:Using cumsum in pandas on group()在 group() 上的 pandas 中使用 cumsum
【发布时间】:2013-03-23 05:06:39
【问题描述】:

来自 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

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

感谢您提供的任何帮助。

【问题讨论】:

    标签: python group-by pandas


    【解决方案1】:

    试试这个:

    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()
    

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

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

    【讨论】:

    • 感谢您的解决方案和解释。我查看它的方式是检查 data3.groupby(level=[0,1,2]).sum() 的结构,它阐明了为什么有必要附加 .groupby(level=[0,1]).cumsum ()。我从没想过 data3.cumsum() 会起作用。
    【解决方案2】:

    正如另一个答案指出的那样,您试图将相同的日期折叠成单行,而 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 列标识的每个组的行内部进行严格的累积总和。

    【讨论】:

    • 这个方法给了我一个 ValueError 来自 lib\site-packages\pandas\core\groupby.pyc 第 581 行,它在 AttributeError 异常上引发它。我正在使用 numpy-1.9.2 和 pandas-0.16.2。
    • @TrisNefzger:我用相同的版本重现了你的错误(我使用的是 pandas 14)。我已经显着修改了我的答案以使用较新的熊猫。
    猜你喜欢
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 2015-12-27
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多