pandas:按组进行分组和聚合,同时保留被分组的列。

28
我有一个如下的pandas数据框。对于每个'Id',我可以有多个'Names'和'Sub-ids'。
Id      NAME   SUB_ID
276956  A      5933
276956  B      5934
276956  C      5935
287266  D      1589

我想压缩数据框,使得每个'Id'只有一行,并且每个'Id'下的所有'names'和'sub_ids'都出现在同一行上,作为一个集合。
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'作为元组的第一个值返回,但我猜当你进行聚合操作时,它就丢失了。有没有办法得到我想要的数据框:即进行分组和聚合操作,同时不丢失被分组的列。

2
请注意,在Series和DataFrames中存储非标量对象仅有有限的支持,并且可能导致意外结果。 - DSM
2个回答

32

如果您不希望groupby作为索引,可以使用一个参数来避免进一步的重置:

df.groupby('Id', as_index=False).agg(lambda x: set(x))

15

按组分组的列成为索引。您只需重置索引即可将其恢复:

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}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接