139 votes

Le groupe des pandas : Comment obtenir une union de chaînes de caractères

J'ai un cadre de données comme ceci :

   A         B       C
0  1  0.749065    This
1  2  0.301084      is
2  3  0.463468       a
3  4  0.643961  random
4  1  0.866521  string
5  2  0.120737       !

Appel à

In [10]: print df.groupby("A")["B"].sum()

retournera

A
1    1.615586
2    0.421821
3    0.463468
4    0.643961

Maintenant, je voudrais faire "la même chose" pour la colonne "C". Comme cette colonne contient des chaînes de caractères, la fonction sum() ne fonctionne pas (bien que l'on puisse penser qu'elle concaténerait les chaînes de caractères). Ce que j'aimerais vraiment voir, c'est une liste ou un ensemble de chaînes de caractères pour chaque groupe, c.-à-d.

A
1    {This, string}
2    {is, !}
3    {a}
4    {random}

J'ai essayé de trouver des moyens de le faire.

Series.unique() ( http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.unique.html ) ne fonctionne pas, bien que

df.groupby("A")["B"]

est un

pandas.core.groupby.SeriesGroupBy object

donc j'espérais que n'importe quelle méthode des séries fonctionnerait. Des idées ?

10voto

user2058811 Points 176

Une solution simple serait :

>>> df.groupby(['A','B']).c.unique().reset_index()

6voto

Amit Points 101

Si vous souhaitez écraser la colonne B dans le cadre de données, cela devrait fonctionner :

    df = df.groupby('A',as_index=False).agg(lambda x:'\n'.join(x))

3voto

Paul4forest Points 75

Suivant la bonne réponse de @Erfan, la plupart du temps, dans une analyse de valeurs agrégées, vous voulez les combinaisons uniques possibles de ces valeurs de caractères existantes :

unique_chars = lambda x: ', '.join(x.unique())
(df
 .groupby(['A'])
 .agg({'C': unique_chars}))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X