【问题标题】:Pandas: Collapsing a multi-index dataframe into a single row and column separated by a commaPandas:将多索引数据框折叠成单行和单列,用逗号分隔
【发布时间】:2021-11-20 15:20:54
【问题描述】:

我有一个看起来像这样的 df:

df.set_index(['pid','vid]).sort_values(by = 'time')

之前:

                          pid    time 

    id           vid      
    
    id1         vis_id1    pid1    t_0      
                vis_id1    pid2    t_1
                vis_id1    pid1    t_2
                vis_id1    pid2    t_3
                vis_id1    pid1    t_4       
    
    id2         vis_id2    pid1    t_3      
                vis_id2    pid2    t_4      
                vis_id2    pid2    t_5      
                vis_id2    pid2    t_6
                vis_id2    pid2    t_7 

我想折叠所有pid,这样对于每个id,我们都有以下df

                                  pid       
id           vid      

id1         vis_id1    pid1, pid2, pid1, pid2, pid1               

id2         vis_id2    pid1, pid2, pid2, pid2, pid2      


  

我尝试过先转置数据,然后再应用[steps].apply(lambda x: ', '.join(x[x.notnull()]), axis = 1),但如果我能同时避免转置,那将为我节省大量计算能力

【问题讨论】:

  • 嗨!谢谢,得到了另一个项目,我很快就会回到这个项目。谢谢!

标签: python pandas dataframe data-analysis multi-index


【解决方案1】:

使用pivot_table:

out = df.pivot_table(index=['id', 'vid'], values='pid', aggfunc=', '.join)
print(out)

# Output:
                                      pid
id  vid                                  
id1 vis_id1  pid1, pid2, pid1, pid2, pid1
id2 vis_id2  pid1, pid2, pid2, pid2, pid2

【讨论】:

    【解决方案2】:

    您可以将.groupby + .agg()', '.join 聚合,如下所示:

    df.groupby(['id', 'vid'])[['pid']].agg(', '.join)
    

    注意[['pid']]pid周围使用的双方括号[[...]]

    结果:

                                          pid
    id  vid                                  
    id1 vis_id1  pid1, pid2, pid1, pid2, pid1
    id2 vis_id2  pid1, pid2, pid2, pid2, pid2
    

    【讨论】:

      猜你喜欢
      • 2020-05-15
      • 2021-01-17
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      • 2018-11-29
      相关资源
      最近更新 更多