Python 通过将第一个数据帧中的一列与第二个数据帧中的两列进行匹配,合并两个数据帧

Python 通过将第一个数据帧中的一列与第二个数据帧中的两列进行匹配,合并两个数据帧,python,pandas,merge,Python,Pandas,Merge,我正在处理两个数据帧: df1 = {'Metropolitan area': {0: 'New York City', 1: 'Los Angeles', 2: 'San Francisco Bay Area', 3: 'Chicago', 4: 'Dallas–Fort Worth'}, 'token_nhl': {0: 'Devils', 1: 'Ducks', 2: 'Sharks', 3: 'Blackhawks', 4: 'Stars'}} 我正在

我正在处理两个数据帧:

df1 = {'Metropolitan area': {0: 'New York City',
  1: 'Los Angeles',
  2: 'San Francisco Bay Area',
  3: 'Chicago',
  4: 'Dallas–Fort Worth'},
 'token_nhl': {0: 'Devils',
  1: 'Ducks',
  2: 'Sharks',
  3: 'Blackhawks',
  4: 'Stars'}}
我正在尝试合并它们,但我希望将df1中“token\u nhl”列的值与df2中的“token\u nhl”和“token\u nhl1”匹配,因此每当我在“token\u nhl”中找不到值时,我都会在“token\u nhl1”中查找它,然后生成的数据帧将是:

{'NHL': {0: 'team1', 1: 'team2', 2: 'team3', 3: 'team4', 4: 'team5'},
 'token_nhl_left': {0: 'Devils', 1: 'Ducks', 2: 'x', 3: 'Stars', 4: 'Sharks'},
 'token_nhl1_left': {0: 'a', 1: 'b', 2: 'Blackhawks', 3: 'c', 4: 'd'},
 'token_nhl_right': {0: 'Devils',1: 'Ducks',2: 'Blackhawks',3: 'Stars',4: 'Sharks'}}

为此,您需要合并两次:

1:重命名列,因为合并后熊猫没有给出两个不同的列

df1 = df1.rename(columns = {"token_nhl":"token_nhl_left"})
df2 = df2.rename(columns = {"token_nhl":"token_nhl_right"})
# creating variables
left_on = "token_nhl_left"
right_on1 = "token_nhl_right"
right_on2 = "token_nhl1"
left_columns = df1.columns
  • 合并-1

     df_temp1 = pd.merge(left = df1, right = df2, left_on = left_on, right_on = right_on1, how = 'left')
    
  • 合并-2

     df_temp2 = pd.merge(left = df_temp1[pd.isna(df_temp1[right_on1])][left_columns], right = df2, left_on = left_on, right_on = right_on2, how = 'left')
    
  • 海螺

     df_final = pd.concat([df_temp1[pd.notna(df_temp1[right_on1])]  , df_temp2])
    

  • 为此,您需要合并两次:

    1:重命名列,因为合并后熊猫没有给出两个不同的列

    df1 = df1.rename(columns = {"token_nhl":"token_nhl_left"})
    df2 = df2.rename(columns = {"token_nhl":"token_nhl_right"})
    # creating variables
    left_on = "token_nhl_left"
    right_on1 = "token_nhl_right"
    right_on2 = "token_nhl1"
    left_columns = df1.columns
    
  • 合并-1

     df_temp1 = pd.merge(left = df1, right = df2, left_on = left_on, right_on = right_on1, how = 'left')
    
  • 合并-2

     df_temp2 = pd.merge(left = df_temp1[pd.isna(df_temp1[right_on1])][left_columns], right = df2, left_on = left_on, right_on = right_on2, how = 'left')
    
  • 海螺

     df_final = pd.concat([df_temp1[pd.notna(df_temp1[right_on1])]  , df_temp2])
    

  • 我处理这个问题的方法包括两个步骤

    1-创建一段代码,将所需信息添加到列表中:

    lis = []
    for (y,w) in zip(list(df2['token_nhl']), list(df2['token_nhl1'])):
        if y in list(df1['token_nhl']):
            lis.append(y)
        else:
            lis.append(w)
    
    2-将该列表分配给包含所有其他所需数据的新数据框。之后,重命名列:

    df3 = df2.assign(token_nhl_right=lis)
    df3.rename(columns={'token_nhl':'token_nhl_left' ,'token_nhl1':'token_nhl1_left'})
    

    我处理这个问题的方法包括两个步骤

    1-创建一段代码,将所需信息添加到列表中:

    lis = []
    for (y,w) in zip(list(df2['token_nhl']), list(df2['token_nhl1'])):
        if y in list(df1['token_nhl']):
            lis.append(y)
        else:
            lis.append(w)
    
    2-将该列表分配给包含所有其他所需数据的新数据框。之后,重命名列:

    df3 = df2.assign(token_nhl_right=lis)
    df3.rename(columns={'token_nhl':'token_nhl_left' ,'token_nhl1':'token_nhl1_left'})
    

    这里,“x”是指nan值?它只是指一个我们不关心的随机值。这里,“x”是指nan值?它只是指一个我们不关心的随机值