0
votes

Les pandas calculent le pourcentage d'occurrence commune d'un groupe par

Je pense que c'est une tâche simple, mais j'ai eu du mal à la faire fonctionner. J'ai un dataframe pandas

df["Occurrence"] = (df.groupby("Name")["Fruit"].transform(lambda x: x.value_counts().index[0])) 

Mon résultat attendu

IDX     Name    Occurrence     Perc
 0      Mary    Grapes         75%
 1      Tom     Apple          75%

Donc, mon résultat final serait une base de données regroupée par nom, avec l'occurrence la plus courante pour les fruits et le pourcentage de cette occurrence

Donc, pour obtenir l'occurrence la plus courante que j'utilise

IDX     Name    Fruit
 0      Mary    Grapes
 1      Tom     Apple
 2      Mary    Grapes
 3      Mary    Apple
 4      Tom     Apple
 5      Mary    Grapes
 6      Tom     Grapes
 7      Tom     Apple

Comment pourrais-je remplir la colonne perc?


0 commentaires

3 Réponses :


1
votes

Faisons un crosstab puis sort_values avec tail

out = pd.crosstab(df.Name,df.Fruit,normalize='index').stack().sort_values().groupby(level=0).tail(1)
Out[65]: 
Name  Fruit 
Mary  Grapes    0.75
Tom   Apple     0.75
dtype: float64


0 commentaires

1
votes

Utilisez Series.value_counts avec normalize=True dans la fonction lambda et retournez la première ligne par DataFrame.head , dernière conversion de la Multiindex Series DataFrame en DataFrame :

df1 = (df.groupby("Name")["Fruit"]
         .apply(lambda x: x.value_counts(normalize=True).head(1))
         .mul(100)
         .rename_axis(['Name','Occurrence'])
         .reset_index(name='Perc'))
print (df1)
   Name Occurrence  Perc
0  Mary     Grapes  75.0
1   Tom      Apple  75.0


1 commentaires

J'étais si proche, il me manquait le "rename_axis", merci!



1
votes

Voici une autre manière.

df['pcts'] = df.groupby(['name','fruit'])['fruit'].transform('size').div(df['fruit'].groupby(df['name']).transform('size'))

df.loc[df.groupby('name')['pcts'].idxmax()]


0 commentaires