Сохранить порядок данных после слияния

1

У меня есть 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() без везения.

Теги:
pandas
dataframe
python-3.x
merge

1 ответ

2
Лучший ответ

Использование: 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
  • 2
    Часть how='left' - это то, что заставляет ее поддерживать порядок

Ещё вопросы

Сообщество Overcoder
Наверх
Меню