2016-07-26 11 views
14

np.where ma semantykę wektoryzowanego if/else (podobnie jak metoda DataFrame Apache Sparka o nazwie when/otherwise). Wiem, że mogę używać np.where na pandach Series, ale pandas często definiuje własny interfejs API zamiast zwykłych funkcji numpy, co jest zwykle wygodniejsze przy użyciu pd.Series/pd.DataFrame.odpowiednik pandy np. Gdzie

Oczywiście, znalazłem pandas.DataFrame.where. Jednak na pierwszy rzut oka ma zupełnie inną semantykę. Nie mogłem znaleźć sposób, aby przepisać najbardziej podstawowy przykład np.where korzystających pand where:

# 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']) 

jestem brakuje czegoś oczywiste? Czy też panda where jest przeznaczona do zupełnie innego zastosowania, pomimo tej samej nazwy, co np.where?

+0

Docstring http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.where.html wydaje się wyjaśniać go dość dobrze (chociaż mógłby użyć przykładu lub dwóch). Zwróć uwagę na krótki opis i opis argumentów "cond" i "other", ale zignoruj ​​opcję, aby argumenty te można było wywoływać. –

+0

@WarrenWeckesser W drugim czytaniu dokumentów, myślę, że mam to ... To coś jak '(df.A + df.B) .where ((df ['A'] <0) | (df [' B ']> 0), df.A/df.B) ', prawda? Wydaje mi się, że usunę moje pytanie. – max

+3

@max: Nie, nie usuwaj. To prawdopodobnie pomoże komuś w przyszłości. – bernie

Odpowiedz

15

Spróbuj:

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

Różnica między numpywhere i DataFramewhere to, że wartości domyślne są dostarczane przez DataFrame że metoda where jest wezwał (docs).

tj.

np.where(m, A, B) 

jest z grubsza odpowiednikiem

A.where(m, B) 

Jeśli chcesz podobną sygnaturę połączeń przy użyciu pandy, można skorzystać z the way method calls work in Python:

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

lub bez kwargs (uwaga: że kolejność argumentów jest różna od numpywhereargument order):

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

@piRSquared Wystarczy przeczytać odpowiedź 'groupby'' agg' pytanie/@ unutbu i pomyślał tak samo! – Alex

+0

Jeśli chcesz pokazać przykład w dokumencie, będzie to wielki wkład! – Jeff

+0

@Jeff Właśnie przesłano PR. Czy masz jakieś zasoby do zrozumienia struktury kodu źródłowego pandy na wysokim poziomie (np. Istniejące dokumenty/posty na forach programistów)? Przeczytałem dokumenty dotyczące wkładu/rozwoju, które znalazłem i nie widziałem niczego podobnego do tego rodzaju widoku kodu źródłowego. – Alex

Powiązane problemy