2016-07-26 87 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