如何在Pandas DataFrame where子句中使用特定列的值?

时间:2013-10-21 00:03:04

标签: python numpy pandas

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

给出以下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也是>时,我想以某种方式选择列大于其先前值的数据。我目前正在尝试使用的语法是:

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进行比较时,我的语法出了什么问题,我该如何实现?

2 个答案:

答案 0 :(得分:4)

这个应该直接工作,但是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

答案 1 :(得分:0)

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

我问题确实是第二个条件你可以发布

的结果
DF.dtypes

考虑到nan数组错误,它看起来不是int类型