我有两段 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]))]
每个部分(例如 all_data['Source'] == 2
)都按照我自己的预期进行,但似乎我在逻辑运算符上做错了,因为最终结果是得出与列表理解版本不同的结果。
最佳答案
&
运算符比 ==
(或任何比较运算符)绑定(bind)得更紧密。参见 the documentation .一个更简单的例子是:
>>> 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]))]
请注意 ==
和 !=
比较前后的额外括号。
关于python - 在构建 Pandas DataFrame 时使用逻辑运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19581582/