Функция merge_asof
Функция merge_asof в Pandas предназначена для выполнения асимметричного слияния двух таблиц DataFrame по ключу, где значения во второй таблице подбираются по ближайшему совпадению к ключу первой таблицы. Это особенно полезно при работе с временными рядами, финансовыми данными или любыми другими упорядоченными числовыми последовательностями. В отличие от обычного слияния merge, которое требует точного совпадения ключей, merge_asof находит для каждой строки левой таблицы строку из правой таблицы с ближайшим значением ключа, не превышающим значение ключа в левой таблице (по умолчанию). Функция поддерживает настройку направления поиска, допуск на разницу значений, а также работу с несколькими ключами.
Синтаксис
pd.merge_asof(left, right, on=None, left_on=None, right_on=None,
left_index=False, right_index=False, by=None, left_by=None,
right_by=None, suffixes=('_x', '_y'), tolerance=None,
allow_exact_matches=True, direction='backward')
Основные параметры
Функция принимает следующие ключевые параметры:
-
left,right- левая и правая таблицы для слияния. -
on- имя столбца для слияния, которое должно присутствовать в обеих таблицах. -
left_on,right_on- имена столбцов для слияния в левой и правой таблицах соответственно. -
by- столбец для группировки перед слиянием (точное совпадение по этому столбцу обязательно). -
tolerance- максимальная допустимая разница между ключами. Если расстояние превышает указанное значение, соответствующая строка не будет найдена. -
direction- направление поиска:'backward'(по умолчанию, ищет ближайшее меньшее или равное значение),'forward'(ближайшее большее или равное) или'nearest'(ближайшее по абсолютной разнице). -
allow_exact_matches- разрешить точные совпадения. Если установить вFalse, точные совпадения будут пропущены.
Пример
Базовое использование функции для слияния двух таблиц с временными метками:
import pandas as pd
left = pd.DataFrame({
'a': [1, 2, 3, 4, 5],
'b': ['L1', 'L2', 'L3', 'L4', 'L5']
})
right = pd.DataFrame({
'a': [1, 3, 4, 6],
'c': ['R1', 'R2', 'R3', 'R4']
})
res = pd.merge_asof(left, right, on='a')
print(res)
Результат выполнения кода:
a b c
0 1 L1 R1
1 2 L2 R1
2 3 L3 R2
3 4 L4 R3
4 5 L5 R3
Пример
Использование параметра tolerance для ограничения максимальной разницы между ключами:
import pandas as pd
left = pd.DataFrame({
'a': [1, 2, 3, 4, 5],
'b': ['L1', 'L2', 'L3', 'L4', 'L5']
})
right = pd.DataFrame({
'a': [1, 3, 4, 6],
'c': ['R1', 'R2', 'R3', 'R4']
})
res = pd.merge_asof(left, right, on='a', tolerance=1)
print(res)
Результат выполнения кода:
a b c
0 1 L1 R1
1 2 L2 R1
2 3 L3 R2
3 4 L4 R3
4 5 L5 NaN
Пример
Использование параметра direction для поиска ближайшего большего значения:
import pandas as pd
left = pd.DataFrame({
'a': [1, 2, 3, 4, 5],
'b': ['L1', 'L2', 'L3', 'L4', 'L5']
})
right = pd.DataFrame({
'a': [1, 3, 4, 6],
'c': ['R1', 'R2', 'R3', 'R4']
})
res = pd.merge_asof(left, right, on='a', direction='forward')
print(res)
Результат выполнения кода:
a b c
0 1 L1 R1
1 2 L2 R2
2 3 L3 R2
3 4 L4 R3
4 5 L5 R4
Пример
Использование параметра by для группировки данных перед слиянием:
import pandas as pd
left = pd.DataFrame({
'group': ['A', 'A', 'B', 'B'],
'a': [1, 2, 1, 3],
'b': ['L1', 'L2', 'L3', 'L4']
})
right = pd.DataFrame({
'group': ['A', 'A', 'B', 'B'],
'a': [0, 2, 2, 4],
'c': ['R1', 'R2', 'R3', 'R4']
})
res = pd.merge_asof(left, right, on='a', by='group')
print(res)
Результат выполнения кода:
group a b c
0 A 1 L1 R1
1 A 2 L2 R2
2 B 1 L3 NaN
3 B 3 L4 R4
Пример
Использование merge_asof с разными именами столбцов в левой и правой таблицах:
import pandas as pd
left = pd.DataFrame({
'left_key': [1, 2, 3, 4, 5],
'value_left': ['A', 'B', 'C', 'D', 'E']
})
right = pd.DataFrame({
'right_key': [1, 3, 4, 6],
'value_right': ['X', 'Y', 'Z', 'W']
})
res = pd.merge_asof(left, right,
left_on='left_key',
right_on='right_key')
print(res)
Результат выполнения кода:
left_key value_left right_key value_right
0 1 A 1.0 X
1 2 B 1.0 X
2 3 C 3.0 Y
3 4 D 4.0 Z
4 5 E 4.0 Z
Смотрите также
-
функция
merge,
которая выполняет стандартное слияние таблиц по точному совпадению ключей -
функция
concat,
которая объединяет таблицы по индексам или осям -
функция
merge_ordered,
которая выполняет упорядоченное слияние с интерполяцией данных -
функция
merge_asof,
которая выполняет асимметричное слияние по ближайшим значениям