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

#python #pandas #dataframe #merge

#python #pandas #фрейм данных #объединить

Вопрос:

Извините, если заголовок недостаточно понятен, я лучше объясню себя на примере:

 dataframe1 = pd.DataFrame(columns=['UniqueNum', 'B' ,'A'])
dataframe1['UniqueNum'] = ['1a','2b', '3c']
dataframe1['A'] = ['2','6', '7']
dataframe1['B'] = ['3','88', '23']
print dataframe1
dataframe2 = pd.DataFrame(columns=['TestId', 'C' ,'D'])
dataframe2['TestId'] = ['1a','2b', '3c', '1a', '3c', '2b']
dataframe2['C'] = ['22','46', '47','22','46', '47']
dataframe2['D'] = ['13','88', '233','22','46', '47']
print dataframe2
  

выводятся:

 >>> 
  UniqueNum   B  A
0        1a   3  2
1        2b  88  6
2        3c  23  7
  TestId   C    D
0     1a  22   13
1     2b  46   88
2     3c  47  233
3     1a  22   22
4     3c  46   46
5     2b  47   47
>>> 
  

Я хочу объединить, чтобы выходной фрейм данных выглядел следующим образом:

       TestId   C    D   B  A
0     1a       22   13   3  2
1     2b       46   88  88  6
2     3c       47  233  23  7
3     1a       22   22   3  2
4     3c       46   46  23  7
5     2b       47   47  88  6
  

Имеется в виду добавить в dataframe2 столбцы со значениями, соответствующими совпадению между UniqueNum в dataframe1 и TestID в dataframe2.
Спасибо

Ответ №1:

Вы можете использовать DataFrame.merge с левым соединением и rename столбцами:

 d = {'UniqueNum':'TestId'}
df = dataframe2.merge(dataframe1.rename(columns=d), how='left', on='TestId')
  

Или вместо этого создать индекс rename и изменить параметры для left_on и right_index :

 df = dataframe2.merge(dataframe1.set_index('UniqueNum'), 
                      how='left', 
                      left_on='TestId', 
                      right_index=True)
  

Или указать оба столбца и последний удалить UniqueNum столбец:

 df = dataframe2.merge(dataframe1, 
                      how='left', 
                      left_on='TestId', 
                      right_on='UniqueNum').drop('UniqueNum', axis=1)
  

 print (df)

  TestId   C    D   B  A
0     1a  22   13   3  2
1     2b  46   88  88  6
2     3c  47  233  23  7
3     1a  22   22   3  2
4     3c  46   46  23  7
5     2b  47   47  88  6