Объединение двух фреймов данных путем сопоставления одного столбца из первого фрейма данных с двумя столбцами из второго фрейма данных

#python #pandas #merge

#python #pandas #слияние

Вопрос:

Я работаю с двумя фреймами данных :

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

Я пытаюсь их объединить, но я хотел бы сопоставить значения столбцов ‘token_nhl’ в df1 с значениями ‘token_nhl’ и ‘token_nhl1’ в df2, поэтому всякий раз, когда я не нахожу значение в ‘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'}}
 

Комментарии:

1. здесь ‘x’ означает значение nan?

2. Это просто означает случайное значение, которое нас не волнует

Ответ №1:

Для этого вам нужно объединить два раза:

1: переименование столбцов, потому что после слияния pandas не дает двух разных столбцов

 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])
     

Ответ №2:

Мой подход к этому вопросу включает в себя два шага.

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