Проблема:
У меня возникла ситуация с двумя кадрами:
test1 = pd.DataFrame({'id_A':['Ben', 'Julie', 'Jack', 'Jack'],
'id_B':['Julie', 'Ben', 'Nina', 'Julie']})
test2 = pd.DataFrame({'id_a':['Ben', 'Ben', 'Ben', 'Julie', 'Julie', 'Nina'],
'id_b':['Julie', 'Nina', 'Jack', 'Nina', 'Jack', 'Jack'],
'value':[1,1,0,0,1,0]})
>>> test1
id_A id_B
0 Ben Julie
1 Julie Ben
2 Jack Nina
3 Jack Julie
>>> test2
id_a id_b value
0 Ben Julie 1
1 Ben Nina 1
2 Ben Jack 0
3 Julie Nina 0
4 Julie Jack 1
5 Nina Jack 0
Я бы хотел сделать слияние test2
с test1
, где id_A == id_a
и id_B == id_b
ИЛИ , где id_A == id_b
и id_B == id_a
, что приводит к следующему кадру данных:
>>> final_df
id_A id_B value
0 Ben Julie 1
1 Julie Ben 1
2 Jack Nina 0
3 Jack Julie 1
Текущее решение:
Мое решение работает, но кажетсягрязный, и я хотел бы посмотреть, пропускаю ли я какой-то более умный способ сделать что-то.Он включает в себя объединение test2
с самим собой, но изменение двух интересующих столбцов (id_a
становится id_b
и наоборот), а затем объединение оттуда.
test3 = pd.concat([test2, test2.rename(columns = {'id_a':'id_b', 'id_b':'id_a'})])
final_df = (test1.merge(test3, left_on = ['id_A', 'id_B'],
right_on = ['id_a', 'id_b'])
.drop(['id_a', 'id_b'], axis=1))
Вопрос:
Кто-нибудь знает более аккуратный способ сделать это?Я чувствую, что, возможно, упускаю из виду какой-то удивительный, изумительный способ ведения дел.
Спасибо за вашу помощь!