我有一个pandas数据帧,如下所示。对于每个Id,我可以有多个名称和子ID。
Id NAME SUB_ID
276956 A 5933
276956 B 5934
276956 C 5935
287266 D 1589
我想压缩数据框,使每个id只有一行,每个id下的所有名称和sub_id在该行上显示为单数集
Id NAME SUB_ID
276956 set(A,B,C) set(5933,5934,5935)
287266 set(D) set(1589)
我尝试将id分组,然后聚合所有其他列
df.groupby('Id').agg(lambda x: set(x))
但是这样做的结果数据帧没有Id列。当你执行groupby时,id将作为元组的第一个值返回,但我想当你聚合时会丢失。有没有办法获得我正在寻找的数据帧。这就是groupby和aggregate,而不会丢失已分组的列。
答案 0 :(得分:16)
如果你不想将groupby作为索引,那么就有一个参数可以避免进一步重置:
df.groupby('Id', as_index=False).agg(lambda x: set(x))
答案 1 :(得分:11)
groupby列成为索引。您只需重置索引即可将其恢复:
In [4]: df.groupby('Id').agg(lambda x: set(x)).reset_index()
Out[4]:
Id NAME SUB_ID
0 276956 {A, C, B} {5933, 5934, 5935}
1 287266 {D} {1589}