【问题标题】:How do I use a specific column's value in a Pandas DataFrame where clause?如何在 Pandas DataFrame where 子句中使用特定列的值?
【发布时间】:2013-10-21 00:03:03
【问题描述】:

当特定列也满足单独的条件时,我正在尝试选择 pandas DataFrame 中满足特定条件的所有单元格。

给定以下数据框:

      A    B    C    D
1/1   0    1    0    1
1/2   2    1    1    1
1/3   3    0    1    0 
1/4   1    0    1    2
1/5   1    0    1    1
1/6   2    0    2    1
1/7   3    5    2    3

D 也> 1 时,我想以某种方式选择列大于其先前值的数据。我当前尝试使用的语法是:

matches = df[(df > df.shift(1)) & (df.D > 1)]

但是,当我这样做时,我收到以下错误:

TypeError: 无法操作 [array([nan, nan, nan, nan], dtype=object)] 具有块值 [无法广播操作数 连同形状 (2016) (4) ]

注意:错误是我的实际代码的直接复制和过去,因此错误中的描述和形状不会直接与我的示例 DataFrame 相关。

我知道df.D > 1 导致了问题,直接将列与D 进行比较是有效的(例如df > df.D)。尝试将 D 与值 1 进行比较时,我的语法有什么问题,我该如何做到这一点?

【问题讨论】:

  • 当您尝试df[df > df.shift(1)][df.D > 1] 时会发生什么?这能达到你想要的吗?

标签: python numpy pandas


【解决方案1】:

这个应该直接工作,但是 pandas 没有广播和操作符(将在 0.14 发生)。这是一种解决方法。

In [74]: df
Out[74]: 
     A  B  C  D
1/1  0  1  0  1
1/2  2  1  1  1
1/3  3  0  1  0
1/4  1  0  1  2
1/5  1  0  1  1
1/6  2  0  2  1
1/7  3  5  2  3

这是一个where操作,本质上是把np.nan放在条件为False的地方

In [78]: x = df[df>df.shift(1)]

In [79]: x
Out[79]: 
      A   B   C   D
1/1 NaN NaN NaN NaN
1/2   2 NaN   1 NaN
1/3   3 NaN NaN NaN
1/4 NaN NaN NaN   2
1/5 NaN NaN NaN NaN
1/6   2 NaN   2 NaN
1/7   3   5 NaN   3

按第二个条件选择

In [80]: x[df.D>1]
Out[80]: 
      A   B   C  D
1/4 NaN NaN NaN  2
1/7   3   5 NaN  3

【讨论】:

  • 谢谢杰夫。因此,如果我理解正确,(df > df.shift(1)) & (df > 1.0) 确实可以工作,因为在这种情况下使用的两个 DataFrame 具有相同的形状。然而,由于df.D 只是一个一维向量,df.D > 1.0 不能与针对整个 DataFrame 的操作一起使用。听起来对吗?
  • yes....问题是系列向量(例如df.D>1看起来应该可以工作,但它应该如何广播却模棱两可,例如那个名为 D 的系列应该适用于所有其他列(在这种情况下它应该做什么?),或者它应该实际上没有名称,这意味着它应该广播。你的问题也可以通过使用df>1.0 来解决,因为我认为这就是你想要的(例如它确实广播)
  • 是否可以在不删除不符合条件的行的情况下以某种方式执行第二次选择,而不是将它们保留为所有NaN 行,就像您在第一个语句执行后看到的那样?对于我的具体要求,必须保持原来的形状。
【解决方案2】:

我认为问题实际上在于移位操作中的布尔数组与另一个条件差。尝试在索引为零的第一个条件中添加一个 false,然后您应该能够组合这两个条件。

我的问题真的是第二个条件,你能发布结果吗

DF.dtypes

鉴于 nan 数组错误,它看起来不是 int 类型

【讨论】:

    猜你喜欢
    • 2022-12-05
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多