2017-10-18 16 views
1

Je veux savoir comment faire une somme sur une colonne en fonction de la valeur d'une autre colonne (0 ou 1)Python: Pandas Somme avec plus d'une condition

id area PP 
a 0,95999998 0 
a 0,44 1 
b 1,6900001 0 
c 2 0 
d 5,8499999 0 
e 0,66000003 1 

je peux trouver la région pour chaque id

surface_id = df.groupby("id")["area"].sum() 

Mais ce que je veux aussi est la zone par id si PP = 1 pour obtenir quelque chose comme ceci:

id area_PP 
a 0,44 
b 0 
c 0 
d 0 
e 0,66000003 

Répondre

3

Essayez:

df.eval('area * PP').groupby(df.id).sum() 

Cela fonctionne simplement en multipliant la colonne area par la colonne PP. 0 annule naturellement le area de manière appropriée.

J'ai choisi d'utiliser eval parce qu'il fait plus frais et que les données volumineuses devraient être plus rapides.

Cela fait la même chose

(df.area * df.PP).groupby(df.id).sum() 
+0

Cela fonctionne comme un charme! Tahnks. Puis-je demander comment fonctionne le code? Est-ce quelque chose comme la zone * PP pour chaque ligne, puis une somme par id? –

+0

Oui! J'ai mis à jour ma réponse pour l'expliquer. – piRSquared

+0

Ok votre solution est simple et rapide, mais si au lieu de 0 et 1 j'avais "A et B"? Je sais que c'est un peu différent de ma première question, mais j'essaie de trouver un moyen qui pourrait fonctionner dans la plupart des situations. –

3

Une façon par transformée, mais plus

df['area_pp'] = df[df.PP == 1].groupby("id")["area"].transform('sum') 
df.fillna(0, inplace = True) 

    id area  PP area_pp 
0 a 0,95999998 0 0 
1 a 0,44  1 0,44 
2 b 1,6900001 0 0 
3 c 2   0 0 
4 d 5,8499999 0 0 
5 e 0,66000003 1 0,66000003 
+1

J'ai eu lettre à lettre même à la même je le jure – Dark

+1

@ Bharathshetty, arrive tout le temps :) – Vaishali

0

Une autre façon:

total=df.groupby(['id', 'PP'])['area'].sum().reset_index(level=1) 
total[total.PP==1].drop(axis=1, labels='PP') 
0

Si vous deviez veux juste les cas marqués positivement la sortie:

df = pd.DataFrame({'id': ('a', 'a', 'b', 'c', 'd', 'e'), 'area': (0.96, 0.44, 
1.69, 2., 5.85, 0.66), 'PP': (0, 1, 0, 0, 0, 1)}) 
df2 = df.where(df.PP==1).groupby('id')['area'].sum()