Python 3.x 当第一次合并的结果为空时,执行第二次合并

Python 3.x 当第一次合并的结果为空时,执行第二次合并,python-3.x,pandas,Python 3.x,Pandas,我事先为格式问题道歉 假设我有两个数据帧,一个带有姓名和电话号码,另一个带有ID,还有两个姓名电话对 df1 = pd.DataFrame([['John Doe', '555-555-5555'], ['Jane Doe', '555-555-5556'], ['Joe Doe', '555-555-5557']], columns=['Name', 'Phone']) df2 = pd.DataFrame([['111','Jimmy Doe', '555-555-5552', 'John

我事先为格式问题道歉

假设我有两个数据帧,一个带有姓名和电话号码,另一个带有ID,还有两个姓名电话对

df1 = pd.DataFrame([['John Doe', '555-555-5555'], ['Jane Doe', '555-555-5556'], ['Joe Doe', '555-555-5557']], columns=['Name', 'Phone'])
df2 = pd.DataFrame([['111','Jimmy Doe', '555-555-5552', 'John Doe', '555-555-5555'], ['112', 'Jane Doe', '555-555-5556', 'Joan Doe','555-555-5553'], ['113','Joe Doe', '555-555-5554', 'Joe Doe', '555-555-5557']], columns=['ID','Name1', 'Phone1', 'Name2', 'Phone2'])
我想合并这两个数据帧,以便从df2获得与df1上的人员数据对应的ID号。在我当前的设置中,我只是多次合并数据帧,首先合并Name1-Phone1集,然后合并Name2-Phone2集

执行此操作时,我会在第一个ID列的第一行和第三行中得到一个空值(可能是ID_X),在第二行中得到一个值


我要做的是编写一个函数,如果第一次合并的结果为空,则使用第二个名称集再次合并。我在概念上遇到的主要障碍是如何应用合并,这是我的理解,我必须基于整个数据帧,仅在ID列为空的行上进行合并。

您可以使用
pd.wide\u to_long
来重塑第二个数据帧,而不是执行多个合并。使用从宽到长的分组列['NameX','PhoneX']是一个真正用户友好的重塑选项

df2 = (pd.wide_to_long(df2, i='ID', j='to_drop', stubnames=['Name', 'Phone'])
         .reset_index()
         .drop(columns='to_drop'))
#    ID       Name         Phone
#0  111  Jimmy Doe  555-555-5552
#1  112   Jane Doe  555-555-5556
#2  113    Joe Doe  555-555-5554
#3  111   John Doe  555-555-5555
#4  112   Joan Doe  555-555-5553
#5  113    Joe Doe  555-555-5557

df1.merge(df2, how='left')


当我明天在办公室的时候,我肯定会尝试这个方法(我的数据比这个例子要复杂一些,所以我想检查一下),但这看起来已经很有希望了。现在投票赞成,如果成功,我会把它作为答案。非常感谢。如果在多组匹配的情况下,它不起作用或合并了太多内容,我可以提供一种迭代方法,只需@me来吸引我的注意力,我可以更新我非常感谢你的帮助。
       Name         Phone   ID
0  John Doe  555-555-5555  111
1  Jane Doe  555-555-5556  112
2   Joe Doe  555-555-5557  113