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
我有一个看起来像这样的 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