熊猫相当于 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/… 似乎可以很好地解释它(尽管它可以使用一两个示例)。注意简短描述,以及cond
和other
参数的描述,但忽略这些参数可调用的选项。
@WarrenWeckesser 在第二次阅读文档时,我想我明白了...类似于(df.A + df.B).where((df['A']<0) | (df['B']>0), df.A/df.B)
,对吗?我猜我会删除我的问题。
@max:不,不要删除。这可能会在将来对某人有所帮助。
【参考方案1】:
试试:
(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'])
【讨论】:
如果您想在文档字符串中显示一个示例,那将是一个很大的贡献! @Jeff 刚刚提交了 PR。您是否有任何资源可以从高层次上理解 pandas 的源代码结构(例如,开发者论坛上的现有文档/帖子)?我通读了我找到的贡献/开发文档,没有看到任何类似于这种 5000 英尺的源代码视图。 如果满足条件,我们想要一个单一的值,我们该怎么办?我们真的不能说1.where(df['A']>df['B'], other=df['C'])
@max 用相同的索引创建一个新的 DataFrame。
@Alex,谢谢! --我使用的是 pd.Dataframe 实例,而不是类对象 pd.DataFrame。使用“pd.DataFrame”有效。以上是关于熊猫相当于 np.where的主要内容,如果未能解决你的问题,请参考以下文章