web-dev-qa-db-fra.com

pandas: groupez et agrégez sans perdre la colonne qui a été groupée

J'ai un pandas dataframe comme ci-dessous. Pour chaque identifiant, je peux avoir plusieurs noms et sous-identifiants.

Id      NAME   SUB_ID
276956  A      5933
276956  B      5934
276956  C      5935
287266  D      1589

Je veux condenser la trame de données de sorte qu'il n'y ait qu'une seule ligne pour chaque identifiant et que tous les noms et sous-identifiants sous chaque identifiant apparaissent comme un ensemble singulier sur cette ligne

Id      NAME           SUB_ID
276956  set(A,B,C)     set(5933,5934,5935)
287266  set(D)         set(1589) 

J'ai essayé de grouper l'ID puis de l'agréger sur toutes les autres colonnes

df.groupby('Id').agg(lambda x: set(x))

Mais ce faisant, la trame de données résultante n'a pas la colonne Id. Lorsque vous effectuez un regroupement, l'ID est renvoyé en tant que première valeur du tuple, mais je suppose que lorsque vous agrégez cela, il est perdu. Existe-t-il un moyen d'obtenir la trame de données que je recherche. C'est à grouper et agréger sans perdre la colonne qui a été groupée.

16
Fizi

Si vous ne voulez pas que le groupby soit un index, il y a un argument pour éviter une réinitialisation supplémentaire:

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

La colonne groupby devient l'index. Vous pouvez simplement réinitialiser l'index pour le récupérer:

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}
12
chrisaycock