gpt4 book ai didi

python - 带有日期时间对象的 pandas Grouper 方法的奇怪行为

转载 作者:太空宇宙 更新时间:2023-11-04 02:25:05 24 4
gpt4 key购买 nike

我正在尝试将 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=1组的最后一组只有3行,所以先在id=2组创建4组?这不是我想做的!

最佳答案

当您使用两个 ID 进行分组时,当您执行每周分组时,您会从第一组溢出到第二组(因为最后一周没有足够的天数来完成组 #1 中的整整 7 天)。当您查看每个组的第一个日期时,这是显而易见的:

第一个案例中的“2018-01-08”与“2018-01-11”。

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

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

关于python - 带有日期时间对象的 pandas Grouper 方法的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50596307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com