2015-06-04 6 views
5

Es tut mir leid, diese scheinbar einfache Frage zu stellen, aber ich bin ein Python Anfänger und konnte nirgends eine Antwort finden. Ich möchte nur eine einfache if-Anweisung, aber Python kehrt laufen:Python If Anweisung gibt Wert Fehler

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

Egal, welche der gegebenen Alternativen I anwenden - es funktioniert einfach nicht. Hast du eine Idee?

import pandas as pd 

    df = pd.DataFrame({'a': [None] * 4, 'b': [2, 3, 10, 3]}) 

    df["c"] =0  
    if df.b == 2: 
     df.c =1 

Antwort

2

Sie können kein Skalar mit einem Array, wie die Verwendung von if vergleichen es mehrdeutig wird als was ist, wenn einer der Werte übereinstimmt oder alle bis auf einen wollen Sie so etwas wie zu tun:

In [3]: 

df['c'] = np.where(df['b'] == 2, 1, np.NaN) 
df 
Out[3]: 
     a b c 
0 None 2 1 
1 None 3 NaN 
2 None 10 NaN 
3 None 3 NaN 

mit np.where schaut auf das gesamte Array für diesen Zustand und wenn True kehrt 1, sonst NaN

Sie Vergleiche Syntax durchführen können wie:

In [4]: 

df['b'] == 2 
Out[4]: 
0  True 
1 False 
2 False 
3 False 
Name: b, dtype: bool 

aber nicht mit if, wenn Sie einen einzelnen Wert vergleichen:

In [8]: 

for index, row in df.iterrows(): 
    if row['b'] == 2: 
     print('equals 2') 
    else: 
     print('some other value') 
equals 2 
some other value 
some other value 
some other value 
+0

Vielen Dank, das war's! –

3

In if Anweisung Sie versuchen, ein Array mit Skalare zu vergleichen. Sie können so etwas wie

if df.b[0] == 2: 
    df.c =1 

oder

if 2 in df.b: 
    df.c =1 

verwenden, wenn Sie wollen für ein bestimmtes Element im Array zu überprüfen.

0

Sie versuchen zu überprüfen, ob df.b, ein List, gleich int ist.

Try this:

if 2 in df.b: 
    df.c=1 
1

Sie setzen df.b eine Liste zu vier Zahlen enthalten. Es kann niemals einer einzelnen Nummer gleich sein.

Und Pandas können nicht den Vergleich einer Liste mit irgendetwas unter Verwendung == behandeln, weil es nicht klar ist, welche Antwort Sie wollen, so dass Sie aufgefordert werden, zu erklären.

http://pandas.pydata.org/pandas-docs/stable/gotchas.html

Ich glaube nicht, dass überhaupt versuchen zu tun, aber es ist nicht klar, was passieren erwarten zu.

0

Nun, zuerst einmal. Sie versuchen, ein bedingtes ganzes Wörterbuch zu verwenden!

Sie sagen im Grunde "wenn diese dictionary == 2", die einfach eine mehrdeutige Aussage ist, weil das Wörterbuch (df.b) eine Menge von Werten ist, die nicht unbedingt zu "wahr" auswerten ..

df.b ist

0  2 
1  3 
2 10 
3  3 

Ehrlich gesagt, basierend auf Ihrer Frage, ich bin mir nicht ganz sicher, was Sie zu bewerten versuchen! Sie sollten versuchen, df zu drucken, bevor Sie in der Unterkomposition von df.b auswerten.