在构建Pandas DataFrame中使用逻辑运算符

发布于 2021-01-29 15:00:04

我有两段熊猫代码,我认为它们应该是等效的,但是第二段代码并没有达到我的期望。

# snippet 1
    data = all_data[[((np.isfinite(all_data[self.design_metric][i]) 
                    and all_data['Source'][i] == 2)) 
                    or ((np.isfinite(all_data[self.actual_metric][i]) 
                    and all_data['Source'][i] != 2))
                    for i in range(len(all_data))]]


# snippet 2
    data = all_data[(all_data['Source'] == 2 &
                    np.isfinite(all_data[self.design_metric])) |
                    (all_data['Source'] != 2 &
                    np.isfinite(all_data[self.actual_metric]))]

每个部分(例如all_data['Source'] == 2)都按照自己的期望进行操作,但是似乎我在逻辑运算符上做错了,因为最终结果与列表理解版本的结果不同。

关注者
0
被浏览
93
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    &操作者比结合更紧密地==(或任何比较操作符)。请参阅文档。一个简单的例子是:

    >>> 2 == 2 & 3 == 3
    False
    

    这是因为将其分组为2 == (2 & 3) == 3,然后调用了比较链接。这就是您的情况。您需要在每个比较之间加上括号。

     data = all_data[((all_data['Source'] == 2) &
                    np.isfinite(all_data[self.design_metric])) |
                    ((all_data['Source'] != 2) &
                    np.isfinite(all_data[self.actual_metric]))]
    

    请注意==!=比较中的多余括号。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看