Pracuję z pandy Muliindex. Używam z_product Metoda. Co dostaję, jest numpy nardarray z multiIndex values Nieruchomość:

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

Zwraca ndarray Ktoczków: [(0, 0) (0, 1) (1, 0) (1, 1)]. Problem polega na tym, że Chcę zachować tylko krotnie, które obie elementy są równe . Ale dlatego, że są krotkami, nie mogę robić wauk w taksów jak ten:

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

Byłoby to możliwe, gdyby były listy zamiast krotek. Czy istnieje sposób filtrowania przez elementy Tuple (może być bardziej złożonym stanem niż powyższy)?

W przypadku, gdy nie ma, co mogę zrobić? Odsuń każdą krotkę do listy? Może ITERUSE nad wszystkimi elementami, ale byłoby zbyt wolne w porównaniu z wizjerskim rozwiązaniem.

Każda pomoc byłaby bardzo doceniana. Z góry dziękuję

0
Genarito 4 wrzesień 2020, 18:42

1 odpowiedź

Najlepsza odpowiedź

Nie dodawaj .values, a następnie koniec, dzięki czemu możesz zadzwonić 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'])

Dla macierzy 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)
1
BENY 4 wrzesień 2020, 15:51