Pandas:将多索引数据框折叠成以逗号分隔的单个行和列

Pandas: Collapsing a multi-index dataframe into a single row and column separated by a comma

我有一个看起来像这样的 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) 但如果我能避免所有转置,那将节省我大量的计算能力

您可以.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

使用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