2015-01-28 15 views
5

Ich habe eine pandas Datenrahmen mit der folgenden Struktur:Conditional Spalte Arithmetik in pandas Datenrahmen

import numpy as np 
import pandas as pd 
myData = pd.DataFrame({'x': [1.2,2.4,5.3,2.3,4.1], 'y': [6.7,7.5,8.1,5.3,8.3], 'condition':[1,1,np.nan,np.nan,1],'calculation': [np.nan]*5}) 

print myData 

    calculation condition x y 
0   NaN   1 1.2 6.7 
1   NaN   1 2.4 7.5 
2   NaN  NaN 5.3 8.1 
3   NaN  NaN 2.3 5.3 
4   NaN   1 4.1 8.3 

Ich möchte einen Wert in der ‚Berechnung‘ Spalte einzugeben basierend auf den Werten in ‚x‘ und ‚y‘ . (zB x/y), aber nur in den Zellen, in denen die 'Bedingung' Spalte NaN (np.isnan enthält (myData [ 'Zustand']) der endgültige Datenrahmen sollte wie folgt aussehen:

calculation condition x y 
0   NaN   1 1.2 6.7 
1   NaN   1 2.4 7.5 
2  0.654  NaN 5.3 8.1 
3  0.434  NaN 2.3 5.3 
4   NaN   1 4.1 8.3 

ich bin glücklich mit der Idee, nacheinander durch jede Zeile zu gehen und dabei eine 'for'-Schleife zu verwenden und dann' if'-Anweisungen zu verwenden, um die Berechnung durchzuführen s, aber der eigentliche Datenrahmen, den ich habe, ist sehr groß und ich wollte die Berechnungen in einer Array-basierten Weise durchführen. Ist das möglich? Ich denke, ich könnte den Wert für alle Zeilen berechnen und dann diejenigen löschen, die ich nicht will, aber das scheint eine Menge verschwendeter Aufwand zu sein (die NaNs sind ziemlich selten im Datenrahmen) und in einigen Fällen ist 'Bedingung' gleich 1 , die Berechnung kann aufgrund der Division durch Null nicht durchgeführt werden.

Vielen Dank im Voraus.

Antwort

7

Verwenden where und geben Ihre Bedingung, um es, dies führt dann nur Ihre Berechnung, wo die Zeilen die Bedingung erfüllen:

In [117]: 

myData['calculation'] = (myData['x']/myData['y']).where(myData['condition'].isnull()) 
myData 
Out[117]: 
    calculation condition x y 
0   NaN   1 1.2 6.7 
1   NaN   1 2.4 7.5 
2  0.654321  NaN 5.3 8.1 
3  0.433962  NaN 2.3 5.3 
4   NaN   1 4.1 8.3 
+0

Perfect! Vielen Dank. – user1718097

Verwandte Themen