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

Jam*_*ull 2 python logical-operators pandas

我有两个pandas代码片段,我认为应该是等效的,但第二个不能达到我的预期.

# 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]))]
Run Code Online (Sandbox Code Playgroud)

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

Bre*_*arn 9

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

>>> 2 == 2 & 3 == 3
False
Run Code Online (Sandbox Code Playgroud)

这是因为它被分组为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]))]
Run Code Online (Sandbox Code Playgroud)

请注意围绕==!=比较的额外括号.