Настройка
m = pd.MultiIndex(levels=[[1, 2, 3, 8], [10, 11]],
labels=[[0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 0, 1, 0, 1, 0, 1]])
Вы можете работать с базовым numpy
массивом
a = np.stack(m.values)
v = df.values
res = v[a]
c = res.shape[-1]
u = pd.DataFrame(res.reshape(-1, df.shape[1]), columns=df.columns)
u['pair'] = np.repeat(np.arange(u.shape[0] // c), c)
col_1 col_2 pair
0 2 3 0
1 20 21 0
2 2 3 1
3 22 23 1
4 4 5 2
5 20 21 2
6 4 5 3
7 22 23 3
8 6 7 4
9 20 21 4
10 6 7 5
11 22 23 5
12 16 17 6
13 20 21 6
14 16 17 7
15 22 23 7
Пояснение
Когда мы индексируем значения DataFrame, используя все комбинации MultiIndex
, мы не только получаем правильные отображения, мы собираем сгруппированные строки вместе в измерении вывода. Мы можем использовать форму из этого, чтобы вывести столбец pair
позже.
print(v[a])
array([[[ 2, 3],
[20, 21]],
[[ 2, 3],
[22, 23]],
[[ 4, 5],
[20, 21]],
[[ 4, 5],
[22, 23]],
[[ 6, 7],
[20, 21]],
[[ 6, 7],
[22, 23]],
[[16, 17],
[20, 21]],
[[16, 17],
[22, 23]]], dtype=int64)