熊猫相当于 np.where

Posted

技术标签:

【中文标题】熊猫相当于 np.where【英文标题】:pandas equivalent of np.where 【发布时间】:2016-11-29 11:47:01 【问题描述】:

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

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

我是否遗漏了一些明显的东西?还是 pandas 的 where 用于完全不同的用例,尽管名称与 np.where 相同?

【问题讨论】:

文档字符串pandas.pydata.org/pandas-docs/stable/generated/… 似乎可以很好地解释它(尽管它可以使用一两个示例)。注意简短描述,以及condother 参数的描述,但忽略这些参数可调用的选项。 @WarrenWeckesser 在第二次阅读文档时,我想我明白了...类似于(df.A + df.B).where((df['A']&lt;0) | (df['B']&gt;0), df.A/df.B),对吗?我猜我会删除我的问题。 @max:不,不要删除。这可能会在将来对某人有所帮助。 【参考方案1】:

试试:

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

numpywhereDataFramewhere 之间的区别在于,默认值由 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(注意:参数的位置顺序与numpywhereargument order不同):

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

【讨论】:

如果您想在文档字符串中显示一个示例,那将是一个很大的贡献! @Jeff 刚刚提交了 PR。您是否有任何资源可以从高层次上理解 pandas 的源代码结构(例如,开发者论坛上的现有文档/帖子)?我通读了我找到的贡献/开发文档,没有看到任何类似于这种 5000 英尺的源代码视图。 如果满足条件,我们想要一个单一的值,我们该怎么办?我们真的不能说1.where(df['A']&gt;df['B'], other=df['C']) @max 用相同的索引创建一个新的 DataFrame。 @Alex,谢谢! --我使用的是 pd.Dataframe 实例,而不是类对象 pd.DataFrame。使用“pd.DataFrame”有效。

以上是关于熊猫相当于 np.where的主要内容,如果未能解决你的问题,请参考以下文章

如何比较具有字符串和整数的列?蟒蛇熊猫

熊猫是否具有多个条件?

在熊猫数据框中矢量化条件赋值

使用 np.where 基于多列的 pandas 多个条件

大熊猫相当于excels'文件来源'

熊猫两个数据框交叉连接[重复]