2015-06-18 4 views
6

Ich lerne Pandas und blieb hier mit diesem Problem stecken.Appending Boolesche Spalte in Panda Datareframe

Ich habe einen Datenrahmen erstellt, der alle Benutzer und die Anzahl von Malen verfolgt, die sie etwas getan haben.

Um besser zu verstehen, das Problem ich dieses Beispiel erstellt:

import pandas as pd 
data = [ 
    {'username': 'me', 'bought_apples': 2, 'bought_pears': 0}, 
    {'username': 'you', 'bought_apples': 1, 'bought_pears': 1} 
] 
df = pd.DataFrame(data) 
df['bought_something'] = df['bought_apples'] > 0 or df['bought_pears'] > 0 

In der letzten Zeile ich eine Spalte hinzufügen wollen, wenn sie Benutzer anzeigt, überhaupt etwas gekauft hat.

Dieser Fehler erscheint:

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

Ich verstehe den Punkt der Mehrdeutigkeit in Panda-Serie (also explained here), aber ich konnte es nicht auf das Problem beziehen.

Interessanter funktioniert diese

df['bought_something'] = df['bought_apples'] > 0 

Kann mir jemand helfen?

Antwort

11

können Sie rufen sum reihenweise und vergleichen, wenn diese größer als 0 ist:

In [105]: 
df['bought_something'] = df[['bought_apples','bought_pears']].sum(axis=1) > 0 
df 

Out[105]: 
    bought_apples bought_pears username bought_something 
0    2    0  me    True 
1    1    1  you    True 

In Bezug auf Ihre ursprüngliche Versuch, die Fehlermeldung Ihnen sagt, dass es nicht eindeutig ist ein Skalar mit einem Array zu vergleichen, wenn Sie wollen or boolean Bedingungen, dann müssen Sie das bitweise Operator | und wickeln Sie die Bedingungen in Klammern aufgrund Operatorpräzedenz verwenden:

In [111]: 
df['bought_something'] = ((df['bought_apples'] > 0) | (df['bought_pears'] > 0)) 
df 

Out[111]: 
    bought_apples bought_pears username bought_something 
0    2    0  me    True 
1    1    1  you    True 
2

T Der Grund für diesen Fehler ist, dass Sie zwei boolesche Vektoren anstelle eines booleschen Skalars verwenden oder anfügen. Deshalb sagt es, dass es mehrdeutig ist.