【问题标题】:Pandas Moving Average on Date熊猫移动平均线日期
【发布时间】:2020-10-16 10:46:57
【问题描述】:

我有一个 df 如下所示:

为数据框添加代码:

df = pd.DataFrame({'Name':['John']*12
                  ,'Type':[*'AABBBBAAABAB']
                  ,'Period':['Noon','Morning']*6
                  ,'Date':['1/1/2020']*2+['1/4/2020']*2+
                          ['1/5/2020']*2+['1/2/2020']*2+
                          ['1/3/2020']*2+['1/19/2020', '1/31/2020']
                  ,'value':[1,2,7,8,9,10,3,4,5,6,5,6]}, index=range(1,13))

基本上我需要一个人(以约翰为例)的值的连续 2 天移动平均值,按类型和时期分类(人也是,但不在此表中)。

预期结果如最后一列所示。 例如1。第 4 行,John 在 Morning 中的 B 型,2020 年 1 月 4 日和 2020 年 1 月 3 日(第 10 行)的平均值为 (6+8)/2=7, 并且在 2020 年 1 月 3 日之前没有 John 的 B 型数据,因此 row10 结果为na

例如 2。第 11 行和第 12 行,它们不是连续的日期,所以都是na

如何使用pandas来实现这个功能?我应该使用transform 还是rolling?

【问题讨论】:

  • 请将您的数据作为文本而不是图像。
  • 是的,我应该感谢..

标签: pandas moving-average


【解决方案1】:

您可以使用以下内容:

df.set_index('Date')\
  .groupby(['Name','Type','Period'])['value']\
  .rolling('2D', min_periods=2)\
  .mean()\
  .reset_index()

输出:

    Name Type   Period       Date  value
0   John    A  Morning 2020-01-01    NaN
1   John    A  Morning 2020-01-02    3.0
2   John    A     Noon 2020-01-01    NaN
3   John    A     Noon 2020-01-02    2.0
4   John    A     Noon 2020-01-03    4.0
5   John    A     Noon 2020-01-19    NaN
6   John    B  Morning 2020-01-04    NaN
7   John    B  Morning 2020-01-05    9.0
8   John    B  Morning 2020-01-03    8.0
9   John    B  Morning 2020-01-31    NaN
10  John    B     Noon 2020-01-04    NaN
11  John    B     Noon 2020-01-05    8.0

并且,一种将其合并回原始数据框的方法:

df_er = (df.set_index('Date')
           .groupby(['Name','Type','Period'])['value']
           .rolling('2D', min_periods=2)
           .mean()
           .rename('Expected Result'))
df.merge(df_er, left_on=['Name', 'Type', 'Period', 'Date'], right_index=True)

输出:

    Name Type   Period       Date  value  Expected Result
1   John    A     Noon 2020-01-01      1              NaN
2   John    A  Morning 2020-01-01      2              NaN
3   John    B     Noon 2020-01-04      7              NaN
4   John    B  Morning 2020-01-04      8              NaN
5   John    B     Noon 2020-01-05      9              8.0
6   John    B  Morning 2020-01-05     10              9.0
7   John    A     Noon 2020-01-02      3              2.0
8   John    A  Morning 2020-01-02      4              3.0
9   John    A     Noon 2020-01-03      5              4.0
10  John    B  Morning 2020-01-03      6              8.0
11  John    A     Noon 2020-01-19      5              NaN
12  John    B  Morning 2020-01-31      6              NaN

【讨论】:

  • 谢谢Scott,请问,当您指定“2D”时,min_periods=2 是什么意思?它们不是同一个意思吗?
  • 其实,没有。 '2D' 意味着滚动两天,min_periods=2 意味着在至少有两个周期之前不要开始计算,如果你删除它,你将得到每个值的平均值计算,即使在第 1 天也是如此。
  • @S.Gu 编码愉快。保持安全并保持健康。
  • 连接部分破坏了我的 32g 内存,实际数据集非常庞大,接近 1m 行,26 列。你有更好的方法吗?只需计算并附加一个结果列作为第 27 列
猜你喜欢
  • 2018-10-01
  • 1970-01-01
  • 2020-07-24
  • 2017-02-24
  • 2021-08-26
  • 1970-01-01
  • 2020-06-12
  • 2021-10-23
相关资源
最近更新 更多