【问题标题】:Merge two data frames by matching one column from the first data frame with two columns from the second data frame通过将第一个数据帧的一列与第二个数据帧的两列匹配来合并两个数据帧
【发布时间】:2021-03-10 05:52:10
【问题描述】:

我正在处理两个数据框:

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'}}
df2 = {'NHL': {0: 'team1', 1: 'team2', 2: 'team3', 3: 'team4', 4: 'team5'},
 'token_nhl': {0: 'Devils', 1: 'Ducks', 2: 'x', 3: 'Stars', 4: 'Sharks'},
 'token_nhl1': {0: 'a', 1: 'b', 2: 'Blackhawks', 3: 'c', 4: 'd'}}

我正在尝试合并它们,但我想将 df1 中的“token_nhl”列的值与 df2 中的“token_nhl”和“token_nhl1”相匹配,所以每当我在'token_nhl',我去'token_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'}}

【问题讨论】:

  • 这里的'x'是指nan值吗?
  • 只是表示我们不关心的随机值

标签: python pandas merge


【解决方案1】:

我解决这个问题的方法包括两个步骤。

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'})

【讨论】:

    【解决方案2】:

    为此你需要合并两次:

    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. 合并1

       df_temp1 = pd.merge(left = df1, right = df2, left_on = left_on, right_on = right_on1, how = 'left')
      
    2. 合并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')
      
    3. 连接

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

    【讨论】:

      猜你喜欢
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 2021-03-07
      • 1970-01-01
      • 2018-11-12
      相关资源
      最近更新 更多