Как проверить равенство между подмножеством pandas dataframe multiindex?

89
11

Скажем, у меня есть два df1 и df2, и каждый из них имеет мультииндекс. первые столбцы с несколькими индексами являются ['A','B','C','D'] и второй ['A','B'].

Я хочу получить dataframe df содержащий строки df1, где df1[['A','B']] == df2[['A','B']]. Этот синтаксис работает, когда ['A','B'] - это некоторые столбцы моего df, но не тогда, когда ['A','B'] находятся в индексе. (Я предпочел бы избегать df.reset_index())

Вот минимальный пример:

L = ([["foo","blih",23,1],
["foo","blah",2,13],
["bar","blih",1,23],
["bar","blah",2,31]])

example = pd.DataFrame(L,columns = ["A","B","value1","value2"])
L2 = ([["blih",23,1],
["blih",1,23]])
example2 = pd.DataFrame(L2,columns = ["B","value1","value2"])
example = example.set_index(["A","B"])
example2 = example2.set_index(["B"])

Вот example dataframe:

          value1  value2
A B
bar blih 1 23
blah 2 31
foo blih 23 1
blah 2 13

и example2:

      value1  value2
B
blih 23 1
blih 1 23

Ожидаемый результат: строки example где example['B'] == example2['B']

          value1  value2
A B
bar blih 1 23
foo blih 23 1

спросил(а) 2021-01-25T21:19:55+03:00 4 месяца, 3 недели назад
1
Решение
99

Вы хотите совместить несколько значений столбцов, некоторые из которых находятся в индексе, а некоторые из них - нет. DataFrame.merge действительно то, что вы хотите.

example.reset_index().merge(example2).set_index(['A', 'B'])

выход:

          value1  value2
A B
bar blih 1 23
foo blih 23 1

Единственная причина, по которой вам нужен reset_index слева от DataFrame заключается в том, что слияние не будет сохранять мультииндекс для столбцов индекса, которые не являются ключами. То есть,

example.merge(example2, on=['B', 'value1', 'value2']) 

выходы:

      value1  value2
B
blih 23 1
blih 1 23

ответил(а) 2021-01-25T21:19:55+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема