pandas 2.0的numpy逻辑元素操作是否被破坏?(np.logical_or)

vptzau2j  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(78)

我有一个代码,在我更新到Pandas2.0之前一直在工作,我检查了changelog,我看到他们改变了logical_or的行为,但这看起来不完全一样:https://github.com/pandas-dev/pandas/pull/37374,所以这对我来说是一个非常意外的错误。

a = pd.DataFrame({"or":[False,True], "a":[True,True], "b":[True, False]})
np.logical_or(a[["a","b"]], a[2*["or"]])

字符串
在2.0之前,它用于执行元素智能“or”,现在它直接失败于0.o,原因是:

ValueError: cannot reindex on an axis with duplicate labels


或者,如果在第二个中提供了两个不同的标签,那么就更糟糕了,因为它不会失败,而是以一种极其不稳定的方式连接两者。
这是Pandas/ numpy上的一个已知错误吗?还是有意为之是否有任何已知的有效替代方案?

uxhixvfz

uxhixvfz1#

上述错误标记为# GH#42568https://github.com/pandas-dev/pandas/pull/42568/files)。实际上,他们更改的代码现在是检查/确保axes["columns"]中的唯一标签。但是,即使我们更改了其中一个输入 Dataframe 上的标签,如

np.logical_or(a[["a","b"]], a[2*["or"]].set_axis(["d","c"], axis=1))

字符串
我们会得到

a     b    c    d
0  True  True  NaN  NaN
1  True   NaN  NaN  NaN


因为看起来2个类似数组的结构在比较时预计具有相同的列标签(如果有的话):

In [642]: np.logical_or(a[["a","b"]], a[2*["or"]].set_axis(["a","b"], axis=1))
Out[642]: 
      a     b
0  True  True
1  True  True


一个简单的解决方法是绕过标签检查,只传递值数组:

In [644]: np.logical_or(a[["a","b"]].values, a[2*["or"]].values)
Out[644]: 
array([[ True,  True],
       [ True,  True]])

相关问题