2014-01-21 13 views
14

traf Ich habe einen Datenrahmen wie folgt aus:Pandas: update Wert, wenn die Bedingung in 3 Spalten

In[1]: df 
Out[1]: 
     A  B  C   D 
1 blue red square  NaN 
2 orange yellow circle  NaN 
3 black grey circle  NaN 

und ich möchte Spalte D aktualisieren, wenn es drei Bedingungen erfüllt. Ex:

df.ix[ np.logical_and(df.A=='blue', df.B=='red', df.C=='square'), ['D'] ] = 'succeed' 

Es funktioniert für die ersten beiden Bedingungen, aber es funktioniert nicht für die dritte, also:

df.ix[ np.logical_and(df.A=='blue', df.B=='red', df.C=='triangle'), ['D'] ] = 'succeed' 

hat genau das gleiche Ergebnis:

In[1]: df 
Out[1]: 
     A  B  C   D 
1 blue red square  succeed 
2 orange yellow circle  NaN 
3 black grey circle  NaN 
+0

tut 'df.ix [(df.A == 'blau') & (DF.B == 'rot') & (df. C == 'Quadrat'), 'D'] = 'Erfolg' Arbeit? – EdChum

Antwort

17

Sie könnte das stattdessen versuchen:

df[ (df.A=='blue') & (df.B=='red') & (df.C=='square') ]['D'] = 'succeed' 
+0

Ja, es funktioniert. Allerdings bekomme ich immer noch nicht den Unterschied zwischen "numpy.logical_and" und "&". Danke –

+0

können Sie auch 'oder' in einer Abfrage wie' df [(df.A == 'blau') | verwenden (df.B == 'red')] ' – TimRich

+8

Wenn die Warnung 'Ein Wert wird versucht, auf eine Kopie eines Slices von einem DataFrame gesetzt' gesetzt wird, während die obige Lösung verwendet wird, folgendes tun:' df.loc [(df .A == 'blau') & (df.B == 'rot') & (df.C == 'quadrat'), 'D'] = 'succeed'' – Shams

1

Der dritte Parameter von logical_and ist die Zuweisung des Arrays, das zum Speichern des Ergebnisses verwendet wird.

Momentan kann die Methode @TimRich die beste sein. In Pandas 0.13 (in Entwicklung) gibt es eine neue experimentelle query Methode. Versuch es!

2

Mit

df[ (df.A=='blue') & (df.B=='red') & (df.C=='square') ]['D'] = 'succeed' 

Gibt unten Warnung

/usr/local/lib/python2.7/dist-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

bessere Art und Weise, dies zu erreichen

df.loc[(df['A'] == 'blue') & (df['B'] == 'red') & (df['B'] == 'square'),'label'] = 'M5' 
Verwandte Themen