将大熊猫python中的3个每月汇总和转移时段分组

时间:2019-03-24 07:20:56

标签: python pandas

问题

我有一个数据框,其中包含许多地区及其销售的单位,进行的访问以及每月的平均访问时间。并非所有地区都有相同的开始日期。

所以我的桌子看起来像这样:

Region    Month       Visits  Average_minutes  Units_sold
Region_1  2018.01.01  12      2.22             120
Region_1  2018.02.01  10      2.02             108
Region_2  2017.04.01  4       1.8              60
Region_2  2017.05.01  4       1.6              56
Region_2  2017.06.01  3       1.5              58
Region_1  2018.03.01  11      2.1              103
Region_3  2018.04.01  3       2.22             20
Region_3  2018.05.01  2       2                22
Region_2  2017.07.01  6       1.7              61
Region_1  2018.04.01  14      2.1              125
Region_3  2018.06.01  3       2.3              21
Region_3  2018.07.01  3       2.4              19
Region_1  2018.05.01  10      2.12             116
Region_2  2017.08.01  3       2.1              55

我希望通过向前移动一个月,以3个月的频率汇总不同地区的每月数据。

因此,如果以Region_1为例,我希望得到的最终结果是这样的:

Region    Date        Visits  Average_minutes  Units_sold  3M_shift
Region_1  2018.01.01  33      2.11             331         0
Region_1  2018.04.01  24      2.11             241         0
Region_1  2018.02.01  35      2.07             336         1
Region_1  2018.05.01  10      2.12             116         1
Region_1  2018.02.01  35      2.07             336         2
Region_1  2018.05.01  10      2.12             116         2

如您所见,日期现在包含3个月频率的开始日期,并且在3M_shift列中,我看到了与第一个可用月份相比的变化。

当然,在上表中,您只能看到Region_1,但我希望所有组都得到此结果。

更多背景

因此,我希望每个组的数据不仅可以汇总业务年度季度,还可以将每个迭代的3个月频次向前移动一个月,直到得出最后一个月为止。

我的代码看起来像这样,但是这将每个区域的开始日期之后的月份进行了分组,我真的不知道如何将开始月份移动一个并迭代到最后一个月份:

grp = joined.groupby(['Region', pd.Grouper(key="Date", freq='3M')]).agg({"Visits":"sum", "Average_minutes":"mean", "Units_sold":"sum"})

例如,对于Region_1,我得到以下结果:

Region  Date          Visits  Average_minutes  Units_sold
Region_1  2018.01.01  33      2.11             331
Region_1  2018.04.01  24      2.11             241

编辑: 添加了我想要得到的更好的可视化效果。

在下面的图片中,您可以看到我的意思。到目前为止,绿色部分是我所拥有的。我想为粉红色的部分做一个循环,但是我不知道该怎么做。

enter image description here

能否请您帮我获得理想的结果?

非常感谢您!

1 个答案:

答案 0 :(得分:1)

我不确定您要寻找的内容是100%,但是按照我的解释,这可能会有所帮助吗?

首先对地区和月份进行排序。

df = df.sort_values(['Region', 'Month'])

设置多重索引。

df = df.set_index(['Region', 'Month'])

然后将区域分组,并应用滚动窗口进行汇总并将其移回两个周期。

df = df.groupby(level='Region').apply(lambda x: x.rolling(window=3).agg({"Visits":"sum", "Average_minutes":"mean", "Units_sold":"sum"}).shift(-2))

结果是:

                     Visits  Average_minutes  Units_sold
Region   Month                                          
Region_1 2018.01.01    33.0         2.113333       331.0
         2018.02.01    35.0         2.073333       336.0
         2018.03.01    35.0         2.106667       344.0
         2018.04.01     NaN              NaN         NaN
         2018.05.01     NaN              NaN         NaN
Region_2 2017.04.01    11.0         1.633333       174.0
         2017.05.01    13.0         1.600000       175.0
         2017.06.01    12.0         1.766667       174.0
         2017.07.01     NaN              NaN         NaN
         2017.08.01     NaN              NaN         NaN
Region_3 2018.04.01     8.0         2.173333        63.0
         2018.05.01     8.0         2.233333        62.0
         2018.06.01     NaN              NaN         NaN
         2018.07.01     NaN              NaN         NaN