2017-07-17 2 views
0

Ich versuche, zwei Spalten zu vergleichen, um zu sehen, ob ein Wert, der größer ist als die andere, aber ich erhalte einen Valueerror bekommen:DataFrame-Spaltenvergleich löst ValueError aus: Der Wahrheitswert einer Serie ist mehrdeutig.

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

Hier ist der Teil, der den Fehler auslöst:

if (cleanedData['Roll Price (Spread)'] > cleanedData['Delta VWAP']): 
    cleanedData["Result"] = "Long" 
else: 
    cleanedData["Result"] = "Short" 

Wie kann ich dieses Problem lösen?

+0

„' if (cleanedData [ 'Roll Preis (Spread)']> cleanedData [ 'Delta VWAP']) 'Sie dies nicht tun können, dass ein Vergleich zurückkehrt. ein Array von booleschen Werten, kein boolescher Wert. " Was? Vielleicht, wenn er nach 'cleanedData ['Delta VWAP'] 'ein Komma hatte –

Antwort

2

Hier ist, wie Sie diesen Fehler reproduzieren:

df = pd.DataFrame({'Roll Price': np.random.randint(1, 10, 10), 
        'Delta VWAP': np.random.randint(1, 10, 10)}) 

df 
Out: 
    Delta VWAP Roll Price 
0   7   6 
1   9   1 
2   9   4 
3   2   4 
4   7   8 
5   8   4 
6   8   6 
7   9   3 
8   2   5 
9   6   8 

if df['Roll Price'] > df['Delta VWAP']: 
    df['Result'] = 'Long' 

Traceback (most recent call last): 

    File "<ipython-input-18-a07b1f06bd42>", line 1, in <module> 
    if df['Roll Price'] > df['Delta VWAP']: 

    File "/home/ayhan/anaconda3/lib/python3.5/site-packages/pandas/core/generic.py", line 955, in __nonzero__ 
    .format(self.__class__.__name__)) 

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

Der Fehler aus diesem Vergleich ergibt sich: df['Roll Price'] > df['Delta VWAP'] Wenn Sie dies ausführen

df['Roll Price'] > df['Delta VWAP'] 
Out: 
0 False 
1 False 
2 False 
3  True 
4  True 
5 False 
6 False 
7 False 
8  True 
9  True 
dtype: bool 

Sie sehen, dass das Ergebnis nicht ein einziges True oder False Wert ist aber stattdessen eine Reihe von Booleans. Und der mehrdeutigen Teil ist

  • Haben Sie die Spalte Long festlegen möchten, wenn alle Werte im Array wahr sind?
  • Möchten Sie die Spalte auf Long10 setzen, wenn einer der Werte im Array True ist?

Es stellt sich heraus, die Antwort ist weder. Sie möchten einen elementweisen Vergleich durchführen und den entsprechenden Wert auf Long setzen, wenn die Bedingung erfüllt ist, andernfalls auf Short.

Dafür können Sie np.where verwenden:

cond = df['Roll Price'] > df['Delta VWAP'] 

df['Result'] = np.where(cond, 'Long', 'Short') 

df 
Out: 
    Delta VWAP Roll Price Result 
0   7   6 Short 
1   9   1 Short 
2   9   4 Short 
3   2   4 Long 
4   7   8 Long 
5   8   4 Short 
6   8   6 Short 
7   9   3 Short 
8   2   5 Long 
9   6   8 Long 
Verwandte Themen