【问题标题】:Using pandas' groupby with shifting使用 pandas 的 groupby 和 shift
【发布时间】:2017-08-25 18:47:44
【问题描述】:

我希望在groupby 操作中使用pd.rolling_mean。我想在每个组中都有一个滚动平均值previous同一组内的元素。这是一个例子:

id    val
0     1
0     2
0     3
1     4
1     5
2     6

id分组,应该转化为:

id    val
0     nan
0     1
0     1.5
1     nan
1     4
2     nan

【问题讨论】:

    标签: python-3.x pandas dataframe group-by cumsum


    【解决方案1】:

    我认为你需要groupbyshiftrolling,窗口大小可以设置为标量:

    df['val']=df.groupby('id')['val'].apply(lambda x: x.shift().rolling(2, min_periods=1).mean())
    print (df)
       id  val
    0   0  NaN
    1   0  1.0
    2   0  1.5
    3   1  NaN
    4   1  4.0
    5   2  NaN
    

    感谢3novak 的评论-您可以通过组的最大长度设置窗口大小:

    f = lambda x: x.shift().rolling(df['id'].value_counts().iloc[0], min_periods=1).mean()
    df['val'] = df.groupby('id')['val'].apply(f)
    print (df)
       id  val
    0   0  NaN
    1   0  1.0
    2   0  1.5
    3   1  NaN
    4   1  4.0
    5   2  NaN
    

    【讨论】:

    • 我认为 OP 的问题可能需要更大的窗口大小。 2 对于这个数据集就足够了,但是应该设置为df['id'].value_counts().iloc[0]
    【解决方案2】:

    相信你想要pd.Series.expanding

    df.groupby('id').val.apply(lambda x: x.expanding().mean().shift())
    
    0    NaN
    1    1.0
    2    1.5
    3    NaN
    4    4.0
    5    NaN
    Name: val, dtype: float64
    

    【讨论】:

      猜你喜欢
      • 2020-09-25
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      相关资源
      最近更新 更多