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.
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))
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}