【发布时间】:2018-11-01 17:34:36
【问题描述】:
问题:
我遇到了 2 个数据框的情况:
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 OR 其中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 与其自身连接,但将感兴趣的 2 列反转(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))
问题:
有没有人知道一个更简洁的方法来做到这一点?我觉得我可能忽略了一些令人惊奇的、讨人喜欢的做事方式。
感谢您的帮助!
【问题讨论】:
标签: python pandas dataframe merge