【问题标题】:Shift and rolling average of not null values in pandas groupbypandas groupby中非空值的移位和滚动平均值
【发布时间】:2019-09-21 03:41:19
【问题描述】:

我正在寻找一种方法来根据过去 n 天内每个组的非空值的平均值生成移动窗口。

例如,如果移动窗口大小为3,我想根据每个ct列中的非空值生成MovAvg列>组(即具有滞后效应)。

Date    Group   ct      MovAvg
1/1/71  A   NaN NaN
2/1/71  A   1   NaN
3/1/71  A   NaN NaN
4/1/71  A   NaN 1
5/1/71  A   1   1
6/1/71  A   NaN 1
7/1/71  A   0   1
8/1/71  A   NaN 0.5
9/1/71  A   NaN 0
10/1/71 A   1   0
11/1/71 A   0   1
1/1/71  B   NaN NaN
2/1/71  B   1   NaN
3/1/71  B   NaN NaN
4/1/71  B   NaN 1
5/1/71  B   0   1
6/1/71  B   1   0
7/1/71  B   1   0.5
8/1/71  B   NaN 0.67
9/1/71  B   NaN 1
10/1/71 B   1   1
11/1/71 B   0   1

【问题讨论】:

    标签: python pandas aggregation


    【解决方案1】:
      df['MovAvg'] = df['ct'].groupby(df['Group']).rolling(3, min_periods=1).mean().shift()
    

    【讨论】:

    • df['ct'].groupby(df['Group']) :这将基于列“组”rolling(3, min_periods=1).mean() 对列 ct 进行分组:对于在第一部分中创建的组,这将计算 3 个周期的滚动平均值。如果至少一行不是 NaN,min_period = 1 将计算平均值。 shift() :这会将您的滚动方式向下移动一个时间段。
    • 好的--您可以编辑您的帖子以包含此信息吗?关于rolling、mean 和shift,你还有什么要说的吗?如果您不确定如何解释您的代码,请查看其他答案。
    【解决方案2】:

    我们可以将rolling 与min_periods=1 一起使用,这需要至少一次有效的观察,因此我们可以在某种程度上解决您的NaN 的问题:

    df['MovAvg'] = pd.concat([d['ct'].rolling(3, min_periods=1).mean().shift() for _, d in df.groupby('Group')])
    

    print(df)
           Date Group   ct    MovAvg
    0    1/1/71     A  NaN       NaN
    1    2/1/71     A  1.0       NaN
    2    3/1/71     A  NaN  1.000000
    3    4/1/71     A  NaN  1.000000
    4    5/1/71     A  1.0  1.000000
    5    6/1/71     A  NaN  1.000000
    6    7/1/71     A  0.0  1.000000
    7    8/1/71     A  NaN  0.500000
    8    9/1/71     A  NaN  0.000000
    9   10/1/71     A  1.0  0.000000
    10  11/1/71     A  0.0  1.000000
    11   1/1/71     B  NaN       NaN
    12   2/1/71     B  1.0       NaN
    13   3/1/71     B  NaN  1.000000
    14   4/1/71     B  NaN  1.000000
    15   5/1/71     B  0.0  1.000000
    16   6/1/71     B  1.0  0.000000
    17   7/1/71     B  1.0  0.500000
    18   8/1/71     B  NaN  0.666667
    19   9/1/71     B  NaN  1.000000
    20  10/1/71     B  1.0  1.000000
    21  11/1/71     B  0.0  1.000000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 2021-10-20
      相关资源
      最近更新 更多