【问题标题】:pandas equivalent of np.where熊猫相当于 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:不,不要删除。这可能会在将来对某人有所帮助。

标签: python pandas numpy where-clause


【解决方案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”有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 2014-09-01
  • 2018-02-02
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多