使用矢量化访问筛选Numpy元组数组



我正在使用Pandas MuliIndex。我使用from_product方法。我得到的是来自MultiIndexvalues属性的Numpy ndarray:

d = {'col1': [1, 2], 'col2': [3, 4], 'col3': [5, 6]}
df1 = pd.DataFrame(data=d)
df2 = pd.DataFrame(data=d)

multi_index = pd.MultiIndex.from_product((df1.index, df2.index), names=['idx1', 'idx2']).values

它返回一个元组Ndarray:[(0, 0) (0, 1) (1, 0) (1, 1)]。问题是我只想保留两个元素相等的元组。但因为它们是元组,所以我不能像这样进行矢量化:

equals = multi_index[multi_index[:, 0] == multi_index[:, 1]]

如果它们是Lists而不是Tuples,那么这是可能的。有没有一种方法可以按元组的元素进行筛选(可能比上面的条件更复杂(?

如果没有,我该怎么办?是否将每个元组强制转换为列表?也许可以对所有元素进行迭代,但与矢量化解决方案相比,这太慢了。

任何形式的帮助都将不胜感激。提前感谢

不要在结束时添加.values,这样就可以调用get_level_values

multi_index = pd.MultiIndex.from_product((df1.index, df2.index), names=['idx1', 'idx2'])
equals = multi_index[multi_index.get_level_values(0) == multi_index.get_level_values(1)]
equals
Out[487]: 
MultiIndex([(0, 0),
(1, 1)],
names=['idx1', 'idx2'])

对于numpy阵列

idx = np.array(pd.MultiIndex.from_product((df1.index, df2.index), names=['idx1', 'idx2']).tolist())
multi_index = pd.MultiIndex.from_product((df1.index, df2.index), names=['idx1', 'idx2']).values
equals = multi_index[idx[:, 0] == idx[:, 1]]
equals
Out[497]: array([(0, 0), (1, 1)], dtype=object)

最新更新