我有两个数据类似的dataframe。我想合并它们,将所有信息合并到一个 Dataframe 中。问题是,如果多个列的合并之间存在冲突(示例中的df1),我希望优先考虑来自一个 Dataframe 的数据。我还想在多个列上执行此操作,如果所选列中的任何一个都匹配。
如果我的解释不够清楚,我道歉。如果有任何其他信息我应该提供请让我知道。
就像我现在做的那样。如果我只选择一个列,这很好用,但我不知道如何在多个列上执行此操作。
merge_by = ['id', 'name1', 'name2']
a = df1.merge(df2, how='outer', on=merge_by)
So how I would imagine this to work is
df1.merge(df2, how='outer', on='id' or 'name1' or 'name2')
df1= DataFrame([
[0, 'john', 'bon', 'ron'],
[1, 'alex', 'dale', 'bruce'],
[2, 'joey', 'bill', 'maci'],
[3, 'choi', 'nath', 'karl'],
[4, 'walt', '', 'xander'],
], columns=['id','name1','name2','name3'])
id name1 name2 name3
0 'john' 'bon' 'ron'
1 'alex' 'dale' 'bruce'
2 'joey' 'bill' 'maci'
3 'choi' 'nath' 'karl'
4 'walt' '' 'xander'
df2= DataFrame([
[0, 'emil', 'tia', 'bia'],
[4, '', 'sara', 'carmen'],
[5, 'aden', 'dale', 'leia'],
[6, 'joey', 'jax', 'jace'],
[7, 'choi', 'nath', 'andre'],
[8, '', '', 'piper'],
], columns=['id','name1','name2','name3'])
id name1 name2 name3
0 'emil' 'tia' 'bia'
4 '' 'sara' 'carmen'
5 'aden' 'dale' 'leia'
6 'joey' 'jax' 'jace'
7 'choi' 'nath' 'andre'
8 '' '' 'piper'
我想要的输出
id name1 name2 name3_x name3_y
0 'john' 'bon' 'ron' 'bia'
1 'alex' 'dale' 'bruce' 'leia'
2 'joey' 'bill' 'maci' 'jace'
3 'choi' 'nath' 'karl' 'andre'
4 'walt' 'sara' 'xander' 'carmen'
8 '' '' '' 'piper'
编辑**代码取自答案here,如下面的评论所建议。
df1= pd.DataFrame([
[0, 'john', 'bon', 'ron'],
[1, 'alex', 'dale', 'bruce'],
[2, 'joey', 'bill', 'maci'],
[3, 'choi', 'nath', 'karl'],
[4, 'walt', '', 'xander'],
], columns=['id','name1','name2','name3'])
df2= pd.DataFrame([
[0, 'emil', 'tia', 'bia'],
[4, '', 'sara', 'carmen'],
[5, 'aden', 'dale', 'leia'],
[6, 'joey', 'jax', 'jace'],
[7, 'choi', 'nath', 'andre'],
[8, '', '', 'piper'],
], columns=['id','name1','name2','name3'])
suff_A = ['_on_A_match_1', '_on_A_match_2']
suff_B = ['_on_B_match_1', '_on_B_match_2']
suff_C = ['_on_C_match_1', '_on_C_match_2']
df = pd.concat([df1.merge(df2[df2['id'] != ''], on='id', suffixes=suff_A),
df1.merge(df2[df2['name1'] != ''], on='name1', suffixes=suff_B),
df1.merge(df2[df2['name2'] != ''], on='name2', suffixes=suff_C)])
dups = (df.id_on_B_match_1 == df.id_on_B_match_2) # also could remove A_on_B_match
a = df.loc[~dups]
print(df)
这一个的问题是id 3是重复的,我不确定如何设置超过2列的dups。还有,我如何将最终输出格式为我想要的答案?
1条答案
按热度按时间kuarbcqp1#