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

4
我将尝试选择 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 大于 1 时。目前我正在尝试使用以下语法:

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

然而,当我这样做时,我收到以下错误:
TypeError: Could not operate [array([nan, nan, nan, nan], dtype=object)] with block values [operands could not be broadcast together with shapes (2016) (4)]
注意:该错误是从我的实际代码直接复制粘贴的,因此错误中的描述和形状与我的示例DataFrame不直接相关。
我知道df.D>1是问题的原因,并且直接将列与D进行比较是有效的(例如,df>df.D)。在尝试将D与值1进行比较时,我的语法有什么问题,我应该如何完成此操作?

1
当你尝试使用df[df > df.shift(1)][df.D > 1]会发生什么?这样做能实现你想要的效果吗? - EdChum
2个回答

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操作,本质上是在条件为False的情况下放置np.nan

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

谢谢Jeff。 如果我理解正确的话,(df > df.shift(1)) & (df > 1.0)有效,因为在此情况下使用的两个数据帧具有相同的形状。 但是,由于df.D只是一个一维向量,因此不能将df.D > 1.0与整个数据帧的操作结合使用。 这听起来正确吗? - mclark1129
是的……问题在于 Series 向量(例如“df.D>1”)看起来应该可以工作,但不清楚它应该如何广播,例如那个名为 D 的 Series 是否应用于所有其他列(如果是这样,它应该做什么?)或者它应该没有名称,这意味着它应该进行广播。你的问题也可以通过使用 “df>1.0” 来解决,因为我认为这就是你的意图(例如,它确实进行广播)。 - Jeff
有没有可能以某种方式执行第二个select语句,而不是删除不符合条件的行,而是像第一个语句执行后看到的那样将它们保留为所有NaN行?对于我的特定要求,必须保持原始形状。 - mclark1129

0

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

如果问题确实出现在第二个条件中,您可以发布结果吗?

DF.dtypes

看起来不是int类型,因为出现了nan数组错误


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接