#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
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])
Ответ №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'})