【问题标题】:Weird behavior with pandas Grouper method with datetime objects带有 datetime 对象的 pandas Grouper 方法的奇怪行为
【发布时间】:2018-05-30 04:15:01
【问题描述】:

我正在尝试将 x 天的组在另一列的组内。由于某种原因,当我添加另一个级别的分组时,分组行为发生了更改

参见下面的玩具示例:

创建一个包含 40 个连续日期、一个 ID 列和随机值的随机数据框:

import numpy as np
import pandas as pd
df = pd.DataFrame(
        {'dates':pd.date_range('2018-1-1',periods=40,freq='D'),
         'id': np.concatenate((np.repeat(1,10),np.repeat(2,30))),
         'amount':np.random.random(40)
         }
)

我想先按id 分组,然后在这些组中连续 7 天进行分组。我愿意:

(df
 .groupby(['id',pd.Grouper(key='dates',freq='7D')])
 .amount
 .agg(['mean','count'])
)

输出是:

                   mean  count
id dates                      
1  2018-01-01  0.591755      7
   2018-01-08  0.701657      3
2  2018-01-08  0.235837      4
   2018-01-15  0.650085      7
   2018-01-22  0.463854      7
   2018-01-29  0.643556      7
   2018-02-05  0.459864      5

第二组发生了一些奇怪的事情!我希望看到 4 组 7 组,然后是最后一组 2 组。当我在仅使用 id=2 的数据帧上运行相同的代码时,我确实得到了我真正期望的结果:

df2=df[df.id==2]

(df2
 .groupby(['id',pd.Grouper(key='dates',freq='7D')])
 .amount
 .agg(['mean','count'])
)

输出

                   mean  count
id dates                      
2  2018-01-11  0.389343      7
   2018-01-18  0.672550      7
   2018-01-25  0.486620      7
   2018-02-01  0.520816      7
   2018-02-08  0.529915      2

这里发生了什么?它是否首先在id=2 组中创建了一组 4 人,因为id=1 组中的最后一个组只有 3 行?这不是我想做的!

【问题讨论】:

    标签: python pandas datetime group-by pandas-groupby


    【解决方案1】:

    当您使用两个 ID 进行分组时,当您执行每周 groupby 时,您会从第一组溢出到第二组(因为上周没有足够的天数来完成第 1 组的完整 7 天)。当您查看每个组的第一个日期时,这一点很明显:

    第一种情况下的“2018-01-08”v/s“2018-01-11”。

    解决方法是对id 执行groupby,然后对apply 执行重采样操作:

    df.groupby('id').apply(
        lambda x: x.set_index('dates').amount.resample('7D').count()
    )
    
    id  dates     
    1   2018-01-01    7
        2018-01-08    3
    2   2018-01-11    7
        2018-01-18    7
        2018-01-25    7
        2018-02-01    7
        2018-02-08    2
    Name: amount, dtype: int64
    

    【讨论】:

    • 谢谢!我试图避免应用 lambda 函数,但我想我们没有更好的方法..
    • @user4505419 是的......不幸的是,那个。你知道,在大多数情况下,你所拥有的东西在 99% 的情况下都会起作用并且是正确的。这只是这些边缘情况的一个问题。无论如何,apply 对于合理大小的数据不应该慢。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 2012-05-25
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 2014-09-30
    相关资源
    最近更新 更多