У меня есть df1
, который должен иметь новый столбец 'h[mm]'
. Значения в новом 'h[mm]'
следует искать в df2
зависимости от значений в df1
'Profile'
. Ситуацию можно сравнить с Excel vlookup или index/match.
Я успешно добавил новый столбец 'h[mm]'
с правильными значениями в df1
. Однако он меняет порядок исходного df1
, что нежелательно в моем случае.
Упрощенная воспроизводимая версия df1
df2
df1
и df2
:
pile_type = ['P01', 'P20', 'P05', 'P23', 'P04', 'P01']
profile = ['HE200A', 'HE220A', 'HE240B', 'NaN', 'HE200A', 'HE300B']
df1 = pd.DataFrame({'Pile_type': pile_type, 'Profile': profile})
profile_database = ['HE200A', 'HE220A', 'HE240B', 'HE500B', 'HE300B']
profile_height_database = [190, 210, 240, 500, 300]
df2 = pd.DataFrame({'Profile': profile_database, 'h[mm]': profile_height_database})
Ближе всего я пришел к решению, используя pd.merge_ordered()
:
df_mo= pd.merge_ordered(df1, df2, left_by='Profile')
Которая по-прежнему не сохраняет исходный порядок df1
в результате df_mo
:
print('df1:', df1)
print('df2:', df2)
print('df_mo:', df_mo)
df1: Pile_type Profile
0 P01 HE200A
1 P20 HE220A
2 P05 HE240B
3 P23 NaN
4 P04 HE200A
5 P01 HE300B
df2: Profile h[mm]
0 HE200A 190
1 HE220A 210
2 HE240B 240
3 HE500B 500
4 HE300B 300
df_mo: Pile_type Profile h[mm]
0 P01 HE200A 190.0
1 P04 HE200A 190.0
2 P20 HE220A 210.0
3 P05 HE240B 240.0
4 P23 NaN NaN
5 P01 HE300B 300.0
Я также попробовал стандартный pd.merge()
без везения.
Использование: df1.merge(df2, how='left')
Как @Graipher указывает, how
параметр, что контролирует порядок в результате объединенного DataFrame
how: {'left,' right, 'outer,' inner}, default 'internal
- left: используйте только ключи из левого кадра, похожие на внешнее соединение SQL слева; сохранить заказ ключа
df1.merge(df2, on='Profile', how='left')
Pile_type Profile h[mm]
0 P01 HE200A 190.0
1 P20 HE220A 210.0
2 P05 HE240B 240.0
3 P23 NaN NaN
4 P04 HE200A 190.0
5 P01 HE300B 300.0
how='left'
- это то, что заставляет ее поддерживать порядок