大熊猫相当于np.where

时间:2016-07-26 00:52:46

标签: python numpy pandas

np.where具有矢量化if / else的语义(类似于Apache Spark的when / otherwise DataFrame方法)。我知道我可以在pandas np.where上使用Series,但pandas经常定义自己使用的API而不是原始numpy函数,这通常会更方便pd.Series 1}} / pd.DataFrame

果然,我找到了pandas.DataFrame.where。但是,乍一看,它具有完全不同的语义。我找不到使用pandas np.where重写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'])

我错过了一些明显的东西吗?或者pandas where是否用于完全不同的用例,尽管名称与np.where相同?

1 个答案:

答案 0 :(得分:25)

尝试:

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

numpy whereDataFrame where之间的区别在于DataFrame方法where提供的默认值被召唤(docs)。

np.where(m, A, B)

大致相当于

A.where(m, B)

如果您想使用pandas进行类似的呼叫签名,您可以利用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(注意:参数的位置顺序与numpy where argument order不同):

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