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
相同?
答案 0 :(得分:25)
尝试:
(df['A'] + df['B']).where((df['A'] < 0) | (df['B'] > 0), df['A'] / df['B'])
numpy
where
和DataFrame
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'])