我为格式事先致歉。
比方说,我有两个数据框,一个带有名称和电话号码,另一个带有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列中获得一个值。
我想做的是编写一个函数,如果第一次合并的结果为空,则使用第二个名称集再次合并。我遇到的主要概念绊脚石是如何应用合并,这是我的理解,我必须基于整个数据框,仅对ID列为空白的行进行操作。
答案 0 :(得分:1)
您可以使用pd.wide_to_long
重塑第二个DataFrame,而不是执行多个合并,从而可以执行一个合并。通过将分组的列['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')
Name Phone ID
0 John Doe 555-555-5555 111
1 Jane Doe 555-555-5556 112
2 Joe Doe 555-555-5557 113