J'ai une trame de données pandas df
comme:
a b
A 1
A 2
B 5
B 5
B 4
C 6
Je veux regrouper par la première colonne et obtenir la deuxième colonne sous forme de listes en lignes :
A [1,2]
B [5,5,4]
C [6]
Est-il possible de faire quelque chose comme ça en utilisant des pandas groupby?
tuple
la deuxième réponse ici: stackoverflow.com/questions/19530568/… . Voir la deuxième réponse dans stackoverflow.com/questions/27439023/… pour des explications.Si les performances sont importantes, descendez au niveau numpy:
Tests:
la source
.groupby([df.index.month, df.index.day])
au lieu de juste.groupby('a')
?Un moyen pratique d'y parvenir serait:
Regardez dans l'écriture d'agrégations personnalisées: https://www.kaggle.com/akshaysehgal/how-to-group-by-aggregate-using-py
la source
lambda args: f(args)
équivaut àf
agg(list)
assez. Voir aussi ici .df.groupby('a').apply(list)
soit l'utiliser avec agg dans le cadre d'un dictdf.groupby('a').agg({'b':list})
. Vous pouvez également l'utiliser avec lambda (que je recommande) car vous pouvez faire beaucoup plus avec. Exemple:df.groupby('a').agg({'c':'first', 'b': lambda x: x.unique().tolist()})
qui vous permet d'appliquer une fonction série au col c et une fonction unique puis liste au col b.Comme vous le disiez, la
groupby
méthode d'unpd.DataFrame
objet peut faire le travail.Exemple
qui donne et une description par index des groupes.
Pour obtenir des éléments de groupes uniques, vous pouvez faire, par exemple
la source
Pour résoudre ce problème pour plusieurs colonnes d'une trame de données:
Cette réponse est inspirée de la réponse d' Anamika Modi . Je vous remercie!
la source
Utilisez une des conditions suivantes
groupby
etagg
recettes.Pour agréger plusieurs colonnes sous forme de listes, utilisez l'une des méthodes suivantes:
Pour lister en groupe une seule colonne, convertissez le groupby en
SeriesGroupBy
objet, puis appelezSeriesGroupBy.agg
. Utilisation,la source
groupby(..., sort=False)
. Ici, cela ne ferait aucune différence puisque je suis en train de regrouper sur la colonne A qui est déjà triée.df.groupby('a')['b'].agg(lambda x: list(set(x)))
Si vous recherchez une liste unique tout en regroupant plusieurs colonnes, cela pourrait probablement aider:
la source
Utilisons
df.groupby
avec la liste et leSeries
constructeurla source
Il est temps d'utiliser
agg
au lieu deapply
.Quand
Si vous voulez que plusieurs colonnes s’empilent dans la liste,
pd.DataFrame
Si vous voulez une seule colonne dans la liste,
ps.Series
Notez que le résultat
pd.DataFrame
est environ 10 fois plus lent que le résultatps.Series
lorsque vous agrégez uniquement une seule colonne, utilisez-la dans le cas de plusieurs colonnes.la source
Ici, j'ai regroupé les éléments avec "|" comme séparateur
la source
La manière la plus simple que j'ai vue ne permet pas d'obtenir la plupart du même résultat au moins pour une colonne qui est similaire à la réponse d' Anamika uniquement avec la syntaxe de tuple pour la fonction d'agrégation.
la source