【问题标题】:Pandas conditional slicing, using both "and" and "or"Pandas 条件切片,同时使用“and”和“or”
【发布时间】:2020-10-03 04:16:22
【问题描述】:

这只是一个带有是或否答案的快速问题。我在谷歌或这里找不到答案(谷歌很难)。

我只是想知道我这样做是否正确。

我正在尝试选择符合某些条件的数据。这是我的代码片段。

c1 = (data['recency']<=3) # seen in the last 3 months
c2 = (data['transactions_per_month']>=1) # buys a ticket once a month
c3 = (data['av_spend_per_month']>=30) # spends at least €30 per month
c4 = (data['Driver']==1) # is a driver

# slice the df
data[c1 & (c2 | c3) & c4]

这部分正确吗? (c2 | c3) 我可以在我的&amp; 条件中间添加一个| 条件吗?

如果错了,正确的做法是什么?

【问题讨论】:

  • 是的,但它需要像 data[ (col1&gt;10)or (col2&lt;10)] 一样,即通过过滤器而不是过滤数据。在此处查看 mroe pandas.pydata.org/pandas-docs/stable/user_guide/…
  • @venky__ 所以你使用了or 而不是|。我是否需要将| 更改为or
  • 使用我应该写的operators( &amp; | ) |
  • 应该更安全:data[((c1) &amp; ((c2) | (c3))) &amp; (c4)]。条件定义周围的括号使它看起来像带有系列的元组对象,这就是我再次放置括号的原因

标签: python pandas


【解决方案1】:

是的,这是完全合理的做法。

根据 Pandas 手册,您可以使用 &amp;|~ 等布尔运算符组合多个选择器。

另一个常见的操作是使用布尔向量来过滤数据。运算符是:| 表示或,&amp; 表示与,~ 表示非。这些必须使用括号进行分组,因为默认情况下 Python 会将 df['A'] &gt; 2 &amp; df['B'] &lt; 3 之类的表达式计算为 df['A'] &gt; (2 &amp; df['B']) &lt; 3,而所需的计算顺序是 (df['A'] &gt; 2) &amp; (df['B'] &lt; 3)

(Source.)

您还可以探索DataFrame.query() 方法,它可以完成类似的事情。

【讨论】:

    猜你喜欢
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 2021-09-18
    • 1970-01-01
    相关资源
    最近更新 更多