PANDAS Поиск точного слова и слова перед словом в столбце строки и добавление этого нового столбца в столбце python (pandas) - PullRequest
4 голосов
/ 18 марта 2019

Найти целевое слово и слово перед в col_a и добавить соответствующую строку в столбцы col_b_PY и col_c_LG

    This code i have tried to achive this functionality but not able to 
get the expected output. if any help appreciated
Here is the below code i approach with regular expressions:

df[''col_b_PY']=df.col_a.str.contains(r"(?:[a-zA-Z'-]+[^a-zA-Z'-]+) 
{0,1}PY")

df.col_a.str.extract(r"(?:[a-zA-Z'-]+[^a-zA-Z'-]+){0,1}PY",expand=True)

Датафрейм выглядит так

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 

Желаемый выход:

col_a                                       col_b_PY      col_c_LG
Python PY is a general-purpose language LG  Python PY     language LG

Programming language LG in Python PY        Python PY     language LG

Its easier LG to understand  PY            understand PY easier LG

The syntax of the language LG is clean PY   clean  PY     language LG

Ответы [ 2 ]

4 голосов
/ 18 марта 2019

Вы можете использовать

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
3 голосов
/ 18 марта 2019

Проверка с

df['col_c_LG'],df['col_c_PY']=df['col_a'].str.extract(r"(\w+\s+LG)"),df['col_a'].str.extract(r"(\w+\s+PY)")
df
Out[474]: 
                                        col_a       ...              col_c_PY
0  Python PY is a general-purpose language LG       ...             Python PY
1       Programming language LG in Python PY        ...             Python PY
2             Its easier LG to understand  PY       ...        understand  PY
3   The syntax of the language LG is clean PY       ...              clean PY
[4 rows x 3 columns]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...