【问题标题】:How would I group by unique values that are in a list form?我将如何按列表形式的唯一值进行分组?
【发布时间】:2019-04-28 17:21:59
【问题描述】:

如果我想根据 id 列获取过去 2 个值的平均值,我会执行以下操作:

df['rolling_mean_2'] = df.groupby('id').apply(lambda x: x.rolling(2, min_periods=2).mean())

>>      id   value  rolling_mean_2
   0    b    1      NaN 
   1    b    3      2
   2    d    5      NaN
   3    d    7      6

没错,直截了当。 好的,现在假设我的 id 是一个具有 4 个唯一值的列表形式 (a, b, c, d)

 x = [{'id': ['a','b','d'], 'value':1},
      {'id': ['b','a','d'], 'value':3},
      {'id': ['b','a','d'], 'value':5},
      {'id': ['a','b','c'], 'value':7}]

 df = pd.DataFrame(x)

现在,如何根据列表中包含的唯一值从过去 2 个值(包括当前行)中获取平均值?因此,我的预期输出如下:

我只打算使用变量 a 和 d 来保持整洁和简单。

>>          id          value      a_rolling_mean_2      d_rolling_mean_2   
      0     [a, b, d]   1          NaN                   NaN
      1     [b, a, d]   3          2                     2          
      2     [b, a, d]   5          4                     4
      3     [a, b, c]   7          6                     NaN          

【问题讨论】:

    标签: python python-3.x pandas lambda pandas-groupby


    【解决方案1】:

    使用concat 和数据框构造函数重新创建数据框

    df=df.rename(columns={'value':'V'})
    newdf=pd.concat([df.V,pd.DataFrame(df.id.tolist(),index=df.index)],axis=1)
    

    然后,使用 melt 和 groupby rolling mean 和 stack 来获得输出

    newdf.reset_index().melt(['index','V']).set_index('index').sort_index().groupby('value').V.rolling(2, min_periods=2).mean().unstack(0)
    Out[260]: 
    value    a    b   c    d
    index                   
    0      NaN  NaN NaN  NaN
    1      2.0  2.0 NaN  2.0
    2      4.0  4.0 NaN  4.0
    3      6.0  6.0 NaN  NaN
    

    【讨论】:

    • 完美!非常感谢
    猜你喜欢
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多