在构建Pandas DataFrame中使用逻辑运算符
我有两段熊猫代码,我认为它们应该是等效的,但是第二段代码并没有达到我的期望。
# 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
)都按照自己的期望进行操作,但是似乎我在逻辑运算符上做错了,因为最终结果与列表理解版本的结果不同。
-
的
&
操作者比结合更紧密地==
(或任何比较操作符)。请参阅文档。一个简单的例子是:>>> 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]))]
请注意
==
和!=
比较中的多余括号。