2016-06-21 18 views
7

Ich habe die folgenden Pandas DataFrame.Pandas: Wie Summen Spalten basierend auf anderen Spaltenwerte bedingt?

import pandas as pd 
df = pd.read_csv('filename.csv') 

print(df) 

    dog  A   B   C 
0  dog1 0.787575 0.159330 0.053095 
1  dog10 0.770698 0.169487 0.059815 
2  dog11 0.792689 0.152043 0.055268 
3  dog12 0.785066 0.160361 0.054573 
4  dog13 0.795455 0.150464 0.054081 
5  dog14 0.794873 0.150700 0.054426 
.. .... 
8  dog19 0.811585 0.140207 0.048208 
9  dog2 0.797202 0.152033 0.050765 
10 dog20 0.801607 0.145137 0.053256 
11 dog21 0.792689 0.152043 0.055268 
    .... 

ich erstellen Sie eine neue Spalte von "A" Spalten Summieren "B", "C" wie folgt:

df['total_ABC'] = df[["A", "B", "B"]].sum(axis=1) 

Jetzt würde ich dies auf einer bedingten Basis zu tun, das heißt, wenn "A" < 0.78 dann eine neue erstellen summierten Spalte df['smallA_sum'] = df[["A", "B", "B"]].sum(axis=1). Andernfalls sollte der Wert Null sein.

Wie erstellt man bedingte Anweisungen wie diese?

Mein Gedanke wäre jedoch

df['smallA_sum'] = df1.apply(lambda row: (row['A']+row['B']+row['C']) if row['A'] < 0.78)) 

zu verwenden, das nicht funktioniert, und ich bin nicht in der Lage Achse angeben.

Wie erstellen Sie eine Spalte basierend auf den Werten anderer Spalten?

Sie auch so etwas wie für jeden df['dog'] == 'dog2' tun könnte, schaffen Spalte dog2_sum, das heißt

df['dog2_sum'] = df1.apply(lambda row: (row['A']+row['B']+row['C']) if df['dog'] == 'dog2')) 

aber mein Ansatz ist falsch.

`

Antwort

5

Folgende Arbeiten sollten, hier maskieren wir die df wo die Bedingung erfüllt ist, diese NaN auf die Zeilen gesetzt werden, wenn die Bedingung nicht erfüllt ist, so wir fillna auf dem neuen col nennen:

In [67]: 
df = pd.DataFrame(np.random.randn(5,3), columns=list('ABC')) 
df 

Out[67]: 
      A   B   C 
0 0.197334 0.707852 -0.443475 
1 -1.063765 -0.914877 1.585882 
2 0.899477 1.064308 1.426789 
3 -0.556486 -0.150080 -0.149494 
4 -0.035858 0.777523 -0.453747 

In [73]:  
df['total'] = df.loc[df['A'] > 0,['A','B']].sum(axis=1) 
df['total'].fillna(0, inplace=True) 
df 

Out[73]: 
      A   B   C  total 
0 0.197334 0.707852 -0.443475 0.905186 
1 -1.063765 -0.914877 1.585882 0.000000 
2 0.899477 1.064308 1.426789 1.963785 
3 -0.556486 -0.150080 -0.149494 0.000000 
4 -0.035858 0.777523 -0.453747 0.000000 

ein anderer Ansatz where auf dem sum Ergebnis zu nennen ist, nimmt dieser Wert param zurückzukehren, wenn die Bedingung nicht erfüllt ist:

In [75]: 
df['total'] = df[['A','B']].sum(axis=1).where(df['A'] > 0, 0) 
df 

Out[75]: 
      A   B   C  total 
0 0.197334 0.707852 -0.443475 0.905186 
1 -1.063765 -0.914877 1.585882 0.000000 
2 0.899477 1.064308 1.426789 1.963785 
3 -0.556486 -0.150080 -0.149494 0.000000 
4 -0.035858 0.777523 -0.453747 0.000000 
+0

Die '.where()' Lösung ist perfekt! Vielen Dank – ShanZhengYang

Verwandte Themen