2016-07-26 15 views
14

np.where hat die Semantik eines vektorisierten if/else (ähnlich Apache Spark when/otherwise DataFrame-Methode). Ich weiß, dass ich np.where auf Pandas Series verwenden kann, aber pandas oft definiert seine eigene API anstelle von numpy Funktionen verwenden, die in der Regel bequemer mit pd.Series/pd.DataFrame ist.Pandas-Äquivalent von np.where

Sicher genug, fand ich pandas.DataFrame.where. Auf den ersten Blick hat es jedoch eine völlig andere Semantik. Ich konnte nicht einen Weg finden, das grundlegendste Beispiel für np.where mit Pandas where neu zu schreiben:

# df is pd.DataFrame 
# how to write this using df.where? 
df['C'] = np.where((df['A']<0) | (df['B']>0), df['A']+df['B'], df['A']/df['B']) 

Bin ich etwas offensichtlich fehlt? Oder ist Pandas where für einen völlig anderen Anwendungsfall gedacht, trotz des gleichen Namens wie np.where?

+0

Die Docstring http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.where.html scheint es ziemlich gut zu erklären (obwohl es ein oder zwei Beispiele verwenden könnte). Beachten Sie die kurze Beschreibung und die Beschreibung der Argumente "cond" und "other", ignorieren Sie jedoch die Option, dass diese Argumente aufrufbar sind. –

+0

@WarrenWeckesser Bei der zweiten Lesung der Dokumente, ich glaube, ich habe es ... Es ist etwas wie '(df.A + df.B). Wo ((df ['A'] <0) | (df [' B ']> 0), df.A/df.B) ', oder? Ich werde meine Frage löschen, denke ich. – max

+3

@max: Nein nicht löschen. Dies wird wahrscheinlich jemandem in der Zukunft helfen. – bernie

Antwort

15

Versuchen:

(df['A'] + df['B']).where((df['A'] < 0) | (df['B'] > 0), df['A']/df['B']) 

Der Unterschied zwischen den numpywhere und DataFramewhere ist, dass die Standardwerte von den DataFrame zugeführt werden, dass die Methode auf where (docs) aufgerufen wird.

I.e.

np.where(m, A, B) 

entspricht in etwa zu

A.where(m, B) 

Wenn Sie einen ähnlichen Anruf Signatur Pandas wollten, könnten Sie die Vorteile von the way method calls work in Python nehmen:

pd.DataFrame.where(cond=(df['A'] < 0) | (df['B'] > 0), self=df['A'] + df['B'], other=df['A']/df['B']) 

oder ohne kwargs (Hinweis: dass die Die arithmetische Reihenfolge der Argumente unterscheidet sich von der numpywhereargument order):

+1

@piRSquared Lesen Sie einfach Ihre 'groupby'' agg' Frage/@ unutbu's Antwort und dachte dasselbe! – Alex

+0

Wenn Sie ein Beispiel in der Doc-Zeichenfolge anzeigen möchten, wäre ein großer Beitrag! – Jeff

+0

@Jeff Ich habe gerade einen PR eingereicht. Verfügen Sie über Ressourcen, um die Quellcode-Struktur von Pandas auf hohem Niveau zu verstehen (z. B. vorhandene Dokumente/Posts in Entwicklerforen)? Ich habe die Beiträge/Entwicklungsdokumente gelesen, die ich gefunden habe, und habe nichts gesehen, was dieser Art von 5000-ft-Ansicht des Quellcodes ähnelt. – Alex

Verwandte Themen