2016-07-26 110 views
14

np.where具有向量化if/else的語義(類似於Apache Spark的when/otherwise DataFrame方法)。我知道我可以在大熊貓Series上使用np.where,但pandas通常定義了自己的API來代替原始的numpy函數,這通常更方便pd.Series/pd.DataFrame。我發現。然而,乍一看,它具有完全不同的語義。我無法找到一個方法來改寫np.where使用熊貓where最基本的例子:熊貓等價於np.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']) 

我失去了一些東西明顯?或者是熊貓where用於完全不同的用例,儘管np.where的名稱相同?

+0

docstring http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.where.html似乎很好地解釋它(雖然它可以使用一個或兩個例子)。注意簡短的描述,以及'cond'和'other'參數的描述,但忽略這些參數被調用的選項。 –

+0

@WarrenWeckesser對文檔的第二次閱讀,我想我明白了......這就像'(df.A + df.B).where((df ['A'] <0)|(df [' B']> 0),df.A/df.B)',對吧?我想我會刪除我的問題。 – max

+3

@max:不要刪除。這將有可能在未來幫助某人。 – bernie

回答

15

嘗試:

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

numpywhereDataFramewhere之間的區別是,默認值是由DataFramewhere方法被調用上(docs)提供。

I.e.

np.where(m, A, B) 

大致相當於

A.where(m, B) 

如果你想使用熊貓類似的調用簽名,你可以採取的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']) 

或不kwargs(注:該自變量的位置順序不同於numpywhereargument order):

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

@piRSquared只讀了你的'groupby'' agg'問題/ @ unutbu的答案,並且正在考慮同樣的事情! – Alex

+0

如果你想在文檔字符串中顯示一個例子將是一個很大的貢獻! – Jeff

+0

@Jeff剛剛遞交了PR。你是否有任何資源來理解熊貓的高級源代碼結構(例如開發者論壇上的現存文檔/帖子)?我閱讀了我發現的貢獻/開發文檔,沒有看到類似於源代碼的這種5000英尺視圖的任何內容。 – Alex