0
votes

Calculer la moyenne pondérée à l'aide de .agg groupé en pandas

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 .Agg () dans pandas . Je suis au courant de quelques solutions, mais ils ne sont pas très concis.

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 : xxx

Voici un exemple entièrement travaillé avec le code qui semble inutilement compliqué: xxx


2 commentaires

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.


4 Réponses :


0
votes

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)


2 commentaires

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) Il renvoie un tuple Tho et pas deux colonnes. Mais peut-être qu'il y a une solution de contournement



0
votes

Depuis votre somme de vos poids à 1 code> dans les groupes, vous pouvez affecter une nouvelle colonne et groupeby comme d'habitude: xxx pré>

sortie: p>

         x  wt_avg_y  weights
group                        
a      1.5      5.25      1.0
b      3.5      7.25      1.0


1 commentaires

@ Stevenm.mortimer Voir la mise à jour d'une solution qui ne nécessite pas poids ajoutant jusqu'à 1 .



0
votes

à 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


0 commentaires

0
votes

Essayez: xxx

sorties: xxx


0 commentaires