我必须执行多次合并,并且我正在寻找一种比每次编写相同代码,创建4个数据帧,合并它们并将它们与原始合并在一起更好的方法。
我有2个数据框,每个数据框都有2列包含数字。我想匹配这4列并输出匹配的数字。
这是示例:
df1 = pd.DataFrame({'Name':['John','Michael', 'Sam'], 'Tel1':['2222','3333', '1111'], 'Tel2':[np.nan, np.nan, '5555']})
df2 = pd.DataFrame({'Second Name':['Smith','Cohen','Moore','Kas', 'Faber'], 'Tel3':['888','3333',np.nan , np.nan, np.nan], 'Tel4':[np.nan, np.nan, np.nan , '1111', np.nan]})
我的代码:
df1_temp = pd.merge(df1,df2, left_on='Tel1', right_on='Tel3', how='left')
df2_temp = pd.merge(df1,df2, left_on='Tel1', right_on='Tel4', how='left')
df3_temp = pd.merge(df1,df2, left_on='Tel2', right_on='Tel3', how='left')
df4_temp = pd.merge(df1,df2, left_on='Tel2', right_on='Tel4', how='left')
concat = pd.concat(df1_temp...)
答案 0 :(得分:1)
您可以融化数据然后合并:
df1['Second Name'] = (df1[['Tel1','Tel2']]
.reset_index()
.melt('index')
.dropna()
.merge(df2.melt('Second Name').dropna(),on='value')
.set_index('index')['Second Name']
)
输出:
Name Tel1 Tel2 Second Name
0 John 2222 NaN NaN
1 Michael 3333 NaN Cohen
2 Sam 1111 5555 Kas
答案 1 :(得分:0)
这并没有缩短很多,但确实消除了一步。
concat = pd.concat([df1.merge(df2,left_on='Tel1', right_on='Tel3',how='left'),
df1.merge(df2,left_on='Tel1', right_on='Tel4',how='left'),
df1.merge(df2,left_on='Tel2', right_on='Tel3',how='left'),
df1.merge(df2,left_on='Tel2', right_on='Tel4',how='left')])
# Drop duplicates
concat.drop_duplicates(inplace=True)
Name Tel1 Tel2 Second Name Tel3 Tel4
0 John 2222 NaN NaN NaN NaN
1 Michael 3333 NaN Cohen 3333 NaN
2 Sam 1111 5555 NaN NaN NaN
1 Michael 3333 NaN NaN NaN NaN
2 Sam 1111 5555 Kas NaN 1111
0 John 2222 NaN Moore NaN NaN
1 John 2222 NaN Kas NaN 1111
2 John 2222 NaN Faber NaN NaN
3 Michael 3333 NaN Moore NaN NaN
4 Michael 3333 NaN Kas NaN 1111
5 Michael 3333 NaN Faber NaN NaN
0 John 2222 NaN Smith 888 NaN
1 John 2222 NaN Cohen 3333 NaN
4 Michael 3333 NaN Smith 888 NaN