pandas:groupby和aggregate,不会丢失已分组的列

时间:2016-09-11 23:03:57

标签: python pandas dataframe group-by

我有一个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,而不会丢失已分组的列。

2 个答案:

答案 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}