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?
3 Réponses :
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
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
J'étais si proche, il me manquait le "rename_axis", merci!
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()]