Настройка
import re
df = pd.DataFrame({
'col1': ['A', 'B', 'C', 'D'],
'col2': ['1,2,3,4,6', '1,5,6,7', '1,3,2,8,9,7', '1,3,6,8']
})
good = [str(i) for i in [2,3,9]]
Мы можем использовать регулярное выражение и re.findall
для извлечения всех допустимых значений, мы просто должны утверждать, чтосовпадения не следуют непосредственно или не предшествуют цифре, поэтому мы не сопоставляем цифры в середине другого числа:
rgx = '(?<!\d)({})(?!\d)'.format('|'.join(good))
df.assign(out=[','.join(re.findall(rgx, row)) for row in df.col2])
col1 col2 out
0 A 1,2,3,4,6 2,3
1 B 1,5,6,7
2 C 1,3,2,8,9,7 3,2,9
3 D 1,3,6,8 3
Regex Объяснение
(?<! # Negative lookbehind
\d # Asserts previous character is *not* a digit
)
( # Matching group
2|3|9 # Matches either 2 or 3 or 9
)
(?! # Negative lookahead
\d # Asserts the following character is *not* a digit
)