2017-07-24 3 views
1

Supposons que je compte combien d'oranges (Orange) et de pommes (Apple) personnes (id) mangent dans un certain laps de temps. Je sais aussi s'ils sont jeunes ou vieux (group). Le dataframe de pandas géants ressemblerait peut-être comme ceci:Différence à moyenne de groupe dans une trame de données pandas?

df = pd.DataFrame({'id' : ['1','2','3','7'], 
        'group' : ['Young', 'Young', 'Old', 'Old'], 
         'Apple' : [7,2,5,4], 
         'Orange' : [3,6,4,4], 
         }) 

On peut facilement calculer en utilisant des moyens groupby(). E. g:

df.Apple.groupby(df.group).mean() 

sorties

Old  4.5 
Young 4.5 

Mais disons, je veux trouver combien la quantité de pommes et des oranges consommées diffère de la moyenne du groupe par personne?

C'est, la sortie devrait être

df = pd.DataFrame({'id' : ['1','2','3','7'], 
        'group' : ['Young', 'Young', 'Old', 'Old'], 
         'Apple' : [7,2,5,4], 
         'Orange' : [3,6,4,4], 
         'Apple Difference' : [2.5, -2.5, 0.5, -0.5], 
         }) 

Est-il possible de le faire avec Pandas/numpy? Désolé pour le Rockie-question Meilleur/R

Répondre

1

Vous devez transform pour mean avec la même length que df et par sub substract:

print (df.groupby('group')['Apple'].transform('mean')) 
0 4.5 
1 4.5 
2 4.5 
3 4.5 
Name: Apple, dtype: float64 

df = pd.DataFrame({'id' : ['1','2','3','7'], 
        'group' : ['Young', 'Young', 'Old', 'Old'], 
         'Apple' : [7,2,5,4], 
         'Orange' : [3,6,4,4], 
         }) 
df['Apple Difference'] = df['Apple'].sub(df.groupby('group')['Apple'].transform('mean')) 
print (df) 
    Apple Orange group id Apple Difference 
0  7  3 Young 1    2.5 
1  2  6 Young 2    -2.5 
2  5  4 Old 3    0.5 
3  4  4 Old 7    -0.5 
+0

Certainement un rôle aujourd'hui, @jezreal :) Merci! Je vais le marquer comme répondu – Rachel

+1

Je voulais écrire * rouler, désolé – Rachel