一尘不染

相当于np.where的pandas

python

np.where具有向量化if / else的语义(类似于Apache Spark的when/
otherwiseDataFrame方法)。我知道我可以np.where在pandas上使用Series,但pandas通常会定义自己的API来代替原始numpy函数使用,通常使用pd.Series/更为方便pd.DataFrame

果然,我发现了pandas.DataFrame.where。但是,乍一看,它具有完全不同的语义。我找不到一种方法来重写np.where使用pandas的最基本的示例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


阅读 199

收藏
2020-12-20

共1个答案

一尘不染

尝试:

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

的之间的差numpy whereDataFrame
where是,默认值是由所提供的DataFrame是,where正在被调用的方法上(文档)。

np.where(m, A, B)

大致相当于

A.where(m, B)

如果您希望使用pandas进行类似的调用签名,则可以利用Python中方法调用的工作方式

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

或不kwargs(注:该参数的位置顺序是从不同的numpy where
参数顺序):

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