Вы можете использовать функцию pop списка:
import pandas as pd
def pop(default, lst):
try:
return lst.pop()
except IndexError:
return default
df = pd.DataFrame({'a': [1, 1, 1, 2, 2], 'b': [11, 22, 33, 44, 55]})
match = {1: [111, 222], 2: [444, 555]}
df['b'] = df[['a', 'b']].apply(lambda e: pop(e[1], match[e[0]]), axis=1)
print(df)
выход
a b
0 1 222
1 1 111
2 1 33
3 2 555
4 2 444
если порядок должен быть сохранен, вы всегда можете выдвинуть первый элемент:
def pop(default, lst):
try:
return lst.pop(0)
except IndexError:
return default
выход
a b
0 1 111
1 1 222
2 1 33
3 2 444
4 2 555
UPDATE
Более быстрый (неразрушающий) способ - использовать deque :
def pop(default, lst):
try:
return lst.popleft()
except IndexError:
return default
match_deque = {k: deque(v[:]) for k, v in match.items()}
df['b'] = df[['a', 'b']].apply(lambda e: pop(e[1], match_deque[e[0]]), axis=1)
print(df)