代码之家  ›  专栏  ›  技术社区  ›  proximacentauri

具有多个groupby的数据帧

  •  2
  • proximacentauri  · 技术社区  · 6 年前

    我有一个熊猫数据框,数据如下:

    测向:

         item   day         time      data  
    0   item_0  2012-12-02  00:00:01  0.81  
    1   item_0  2012-12-02  00:00:02  0.07
    2   item_0  2012-12-03  00:00:00  0.84  
    3   item_1  2012-12-02  00:00:01  0.47
    

    我正在努力转变为:

         item   day         time_0    time_1   time_2  
    0   item_0  2012-12-02  NaN       0.81     0.07
    1   item_0  2012-12-03  0.84      NaN      NaN  
    2   item_1  2012-12-02  NaN       0.47     ... 
    

    df_stage_1 = df.groupby(['item','day']).apply(lambda x: x['time'].tolist()).reset_index()
    

    df_stage_1 = pd.DataFrame(df_stage_1.tolist(), )
    

    上面的代码为我提供了一个(未对齐的)时间值的dataframe,我可以对齐(见上文)并将其附加到上面步骤中创建的dataframe中,但我无法解决如何在正确的时间对齐列中获取dataframe的值

    2 回复  |  直到 6 年前
        1
  •  4
  •   jpp    6 年前

    你可以用 pd.pivot_table :

    res = df.pivot_table(index=['item', 'day'], columns='time',
                         values='data', aggfunc='first').reset_index()
    
    print(res)
    
    time    item         day  00:00:00  00:00:01  00:00:02
    0     item_0  2012-12-02       NaN      0.81      0.07
    1     item_0  2012-12-03      0.84       NaN       NaN
    2     item_1  2012-12-02       NaN      0.47       NaN
    
        2
  •  2
  •   Peter Leimbigler    6 年前

    另一个解决办法是 set_index , unstack , reset_index

    df.set_index(['item', 'day', 'time'])['data'].unstack().reset_index()
    
    time    item         day  00:00:00  00:00:01  00:00:02
    0     item_0  2012-12-02       NaN      0.81      0.07
    1     item_0  2012-12-03      0.84       NaN       NaN
    2     item_1  2012-12-02       NaN      0.47       NaN
    

    记得吗 df.unstack 拆垛