J'ai un dataframe comme celui-ci:
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()
reviendra
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". Étant donné que cette colonne contient des chaînes, sum () ne fonctionne pas (bien que vous puissiez penser que cela concaténerait les chaînes). Ce que j'aimerais vraiment voir, c'est une liste ou un ensemble de chaînes pour chaque groupe, c'est-à-dire
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 de série fonctionnerait. Des idées?
apply
etlambda
s. Je suis venu ici en me demandant pourquoi enpandas
fait concat et ne pas renvoyer une erreur sur la sommation des chaînes.Vous pouvez utiliser la
apply
méthode pour appliquer une fonction arbitraire aux données groupées. Donc, si vous voulez un ensemble, postulezset
. Si vous voulez une liste, postulezlist
.Si vous voulez autre chose, écrivez simplement une fonction qui fait ce que vous voulez et ensuite
apply
cela.la source
.reset_index()
.Vous pourrez peut-être utiliser la fonction
aggregate
(ouagg
) pour concaténer les valeurs. (Code non testé)la source
Vous pouvez essayer ceci:
la source
une solution simple serait:
la source
df.groupby(['A','B']).c.unique().apply(lambda x: ';'.join(x)).reset_index()
Agrégations nommées avec
pandas >= 0.25.0
Depuis la version 0.25.0 de pandas, nous avons nommé des agrégations où nous pouvons grouper, agréger et en même temps attribuer de nouveaux noms à nos colonnes. De cette façon, nous n'obtiendrons pas les colonnes MultiIndex, et les noms de colonne ont plus de sens étant donné les données qu'ils contiennent:
agréger et obtenir une liste de chaînes
agréger et joindre les chaînes
la source
Si vous souhaitez écraser la colonne B dans le dataframe, cela devrait fonctionner:
la source
Suite à 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:
la source