Вы можете использовать
df['col_b_PY'] = df['col_a'].str.extract(r"([a-zA-Z'-]+\s+PY)\b")
df['col_c_LG'] = df['col_a'].str.extract(r"([a-zA-Z'-]+\s+LG)\b")
Или, чтобы извлечь все совпадения и объединить их с пробелом:
df['col_b_PY'] = df['col_a'].str.extractall(r"([a-zA-Z'-]+\s+PY)\b").unstack().apply(lambda x:' '.join(x.dropna()), axis=1)
df['col_c_LG'] = df['col_a'].str.extractall(r"([a-zA-Z'-]+\s+LG)\b").unstack().apply(lambda x:' '.join(x.dropna()), axis=1)
Обратите внимание, что вам нужно использовать группу захвата в шаблоне регулярных выражений, чтобычто extract
может фактически извлечь текст:
Извлечь захватить группы в регулярном выражении pat как столбцы в DataFrame.
Обратите внимание, что граница слова \b
необходима, чтобы соответствовать PY
/ LG
как целому слову.
Кроме того, если вы хотите начать совпадение только сбуквой, вы можете изменить шаблон на
r"([a-zA-Z][a-zA-Z'-]*\s+PY)\b"
r"([a-zA-Z][a-zA-Z'-]*\s+LG)\b"
^^^^^^^^ ^
, где [a-zA-Z]
будет соответствовать букве, а [a-zA-Z'-]*
будет соответствовать 0 или более букв, апострофов или дефисов.
Python 3.7 с пандами0.24.2:
pd.set_option('display.width', 1000)
pd.set_option('display.max_columns', 500)
df = pd.DataFrame({
'col_a': ['Python PY is a general-purpose language LG',
'Programming language LG in Python PY',
'Its easier LG to understand PY',
'The syntax of the language LG is clean PY',
'Python PY is a general purpose PY language LG']
})
df['col_b_PY'] = df['col_a'].str.extractall(r"([a-zA-Z'-]+\s+PY)\b").unstack().apply(lambda x:' '.join(x.dropna()), axis=1)
df['col_c_LG'] = df['col_a'].str.extractall(r"([a-zA-Z'-]+\s+LG)\b").unstack().apply(lambda x:' '.join(x.dropna()), axis=1)
Выход:
col_a col_b_PY col_c_LG
0 Python PY is a general-purpose language LG Python PY language LG
1 Programming language LG in Python PY Python PY language LG
2 Its easier LG to understand PY understand PY easier LG
3 The syntax of the language LG is clean PY clean PY language LG
4 Python PY is a general purpose PY language LG Python PY purpose PY language LG