Je voudrais calculer, par groupe, la moyenne d'une colonne et la moyenne pondérée d'une autre colonne d'un ensemble de données à l'aide de la fonction Une solution a été posté ici ( Pandas et Groupby: Comment calculer les moyennes pondérées dans un AGG , mais cela ne semble toujours pas très flexible car la colonne Poids est codée dur dans la définition de la fonction Lambda. Je cherche à créer une syntaxe plus proche de cette : p> Voici un exemple entièrement travaillé avec le code qui semble inutilement compliqué: p> .Agg () code> dans
4 Réponses :
Que diriez-vous de cela:
grouped = df.groupby('group') def wavg(group): group['mean_x'] = group['x'].mean() group['wavg_y'] = np.average(group['y'], weights=group.loc[:, "weights"]) return group grouped.apply(wavg)
C'est la solution que j'ai liée à. Il code du disque la colonne Poids de la définition de la fonction. Je préférerais les transmettre comme un argument. Je pense que le problème est difficile à résoudre car les opérations AGG uniquement sur une seule colonne à la fois.
Ah, désolé je ne voyais pas que tu l'as lié. En effet, l'œuf agit sur une seule colonne. On peut jouer avec Apply Tho. Quelque chose comme ceci: groupé = df.groupby («groupe») def wa (groupe): Retour Groupe ['x']. Moyenne (), np.avery (groupe ['y'], poids = groupe. loc [:, "poids"]) groupé.Apply (WA) code> Il renvoie un tuple Tho et pas deux colonnes. Mais peut-être qu'il y a une solution de contournement
Depuis votre somme de vos poids à sortie: p> 1 code> dans les groupes, vous pouvez affecter une nouvelle colonne et groupeby comme d'habitude:
x wt_avg_y weights
group
a 1.5 5.25 1.0
b 3.5 7.25 1.0
@ Stevenm.mortimer Voir la mise à jour d'une solution qui ne nécessite pas poids code> ajoutant jusqu'à
1 code>.
à l'aide de la méthode .Apply () code> sur l'ensemble de l'ensemble de données était la solution la plus simple que je puisse arriver sur celle-ci pas em> code le nom de la colonne dans la définition de la fonction.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'group': ['a', 'a', 'b', 'b'],
'x': [1, 2, 3, 4],
'y': [5, 6, 7, 8],
'weights': [0.75, 0.25, 0.75, 0.25]
})
summary = (
df
.groupby(['group'])
.apply(
lambda x: pd.Series([
np.mean(x['x']),
np.average(x['y'], weights=x['weights'])
], index=['avg_x', 'wt_avg_y'])
)
.reset_index()
)
# final output
summary
#>>> group avg_x wt_avg_y
#>>> 0 a 1.50 5.25
#>>> 1 b 3.50 7.25
Essayez: sorties: p>
Est-ce que cela répond à votre question? Calculer la moyenne pondérée à l'aide d'un pandas / Dataframe
Non, car il nécessite deux calculs distincts un avec un .agg et un autre avec .apply pour la moyenne pondérée.