【问题标题】:Pandas - shifting a rolling sum after grouping spills over to following groups熊猫 - 分组后移动滚动总和溢出到以下组
【发布时间】:2021-02-12 00:07:33
【问题描述】:

我可能做错了什么,但我试图在对数据框进行分组后计算滚动平均值(为简单起见,我们在此示例中使用 sum)。直到这里一切正常,但是当我应用班次时,我发现值溢出到下面的组中。请参见下面的示例:

import pandas as pd

df = pd.DataFrame({'X': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
                   'Y': [1, 2, 3, 1, 2, 3, 1, 2, 3]})

grouped_df = df.groupby(by='X')['Y'].rolling(window=2, min_periods=2).sum().shift(periods=1)
print(grouped_df)

预期结果:

X   
A  0    NaN
   1    NaN
   2    3.0
B  3    NaN
   4    NaN
   5    3.0
C  6    NaN
   7    NaN
   8    3.0

我实际得到的结果:

X   
A  0    NaN
   1    NaN
   2    3.0
B  3    5.0
   4    NaN
   5    3.0
C  6    5.0
   7    NaN
   8    3.0

您可以看到 A2 的结果被传递给 B3,而 B5 的结果被传递给 C6。我不确定这是预期的行为,我做错了什么或者熊猫中有一些错误?

谢谢

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    问题是

    df.groupby(by='X')['Y'].rolling(window=2, min_periods=2).sum()
    

    返回一个新系列,然后当您与 shift() 链接时,您将整个系列移动,而不是在组内。

    您需要另一个groupby 才能在组内换班:

    grouped_df = (df.groupby(by='X')['Y'].rolling(window=2, min_periods=2).sum()
                    .groupby(level=0).shift(periods=1)
                 )
    

    或者使用groupby.transform:

    grouped_df = (df.groupby('X')['Y']
                    .transform(lambda x: x.rolling(window=2, min_periods=2)
                                          .sum().shift(periods=1))
                 )
    

    输出:

    X   
    A  0    NaN
       1    NaN
       2    3.0
    B  3    NaN
       4    NaN
       5    3.0
    C  6    NaN
       7    NaN
       8    3.0
    Name: Y, dtype: float64
    

    【讨论】:

      猜你喜欢
      • 2016-02-20
      • 2021-04-24
      • 2020-02-18
      • 2019-04-11
      • 2017-02-06
      • 2018-09-30
      • 2019-05-20
      • 2020-10-12
      • 2018-07-30
      相关资源
      最近更新 更多