首页 > 解决方案 > 当第一次合并的结果为空时执行第二次合并

问题描述

我提前为格式道歉。

假设我有两个数据框,一个带有姓名和电话号码,另一个带有 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 列为空白的行上进行。

标签: python-3.xpandas

解决方案


您可以使用重塑第二个 DataFrame 而不是执行多个合并,pd.wide_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')

       Name         Phone   ID
0  John Doe  555-555-5555  111
1  Jane Doe  555-555-5556  112
2   Joe Doe  555-555-5557  113

推荐阅读