2016-10-19 5 views
0

Ich habe eine berechnete Spalte in einem Pandas DataFrame, die Basis für eine Bedingung zugewiesen werden muss. Zum Beispiel:Bedingt berechnete Spalte für einen Pandas DataFrame

if(data['column_a'] == 0): 
    data['column_c'] = 0 
else: 
    data['column_c'] = data['column_b'] 

jedoch, die einen Fehler zurückgibt:

 
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

Ich habe das Gefühl, das etwas mit der Tatsache zu tun hat, die in einer Matrix-Stil ist getan werden muss. Das Ändern des Codes in eine ternäre Anweisung funktioniert auch nicht:

data['column_c'] = 0 if data['column_a'] == 0 else data['column_b'] 

Wer kennt den richtigen Weg, dies zu erreichen? Verwenden Sie mit einem Lambda? Ich könnte über eine Schleife iterieren, aber ich behalte lieber die bevorzugte Variante der Pandas.

Antwort

0

können Sie tun:

data['column_c'] = data['column_a'].where(data['column_a'] == 0, data['column_b']) 

dies Ihre Versuche vektorisiert ist fehlgeschlagen, da der Vergleich mit if versteht nicht, wie ein Array von Boolesche Werte behandeln daher der Fehler

Beispiel:

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

Out[81]: 
      a   b   c 
0 -1.065074 -1.294718 0.165750 
1 -0.041167 0.962203 0.741852 
2 0.714889 0.056171 1.197534 
3 0.741988 0.836636 -0.660314 
4 0.074554 -1.246847 0.183654 

In [82]: 
df['d'] = df['b'].where(df['b'] < 0, df['c']) 
df 

Out[82]: 
      a   b   c   d 
0 -1.065074 -1.294718 0.165750 -1.294718 
1 -0.041167 0.962203 0.741852 0.741852 
2 0.714889 0.056171 1.197534 1.197534 
3 0.741988 0.836636 -0.660314 -0.660314 
4 0.074554 -1.246847 0.183654 -1.246847 
0

Verwendung where() und notnull()

data['column_c'] = data['column_b'].where(data['column_a'].notnull(), 0) 
Verwandte Themen