Как сопоставить комбинацию двух строк в python, чтобы найти индексы строк? - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь найти индексы строк, которые содержат комбинацию нескольких строк в python. Пожалуйста, найдите воспроизводимый код ниже.

  df=[['Monday, 13 January 2020','',''],['Start',13588,'Jack'],['Starting','','Finish'],['','','City 1'],['Task',13589,'Finish'],['','','Address 2'],['','','City'],['Task 3',13589,'Amanda'],['','','Address 3'],['','','City 3'],['Tuesday, 14 January 2020','',''],['Task 4',13587,'Chelsea'],['','','Address 4'],['','','City 4'],['Task 5','13586','Ibrahim'],['','','Address 5'],['','','City 5'],['Task 6',13585,'Kate'],['','','Address 6'],['','','City 6']]
df=pd.DataFrame(df)
df.columns = ['Task','ID','Supervisor']

Вот моя попытка. Например, я хочу получить индексы строк, которые содержат как start, так и finish или task и finish

Вот моя попытка ниже:

    findrowindex = df[df.apply(lambda row: 
row.astype(str).str.contains(r'\b(?:start&finish|task&Finishing)\b').any(), axis=1)].index

Ответы [ 3 ]

2 голосов
/ 27 мая 2020

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

m = (
    df[['Task', 'Supervisor']].agg(' '.join, axis=1)
    .str.contains(r'^(?:start.*finish|task.*finish)$', case=False)
)

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

m = (
    df['Task'].str.contains(r'^(?:start|task)', case=False) 
    & df['Supervisor'].str.contains(r'finish$', case=False)
)

Результат:

# print(df[m])

       Task     ID Supervisor
2  Starting            Finish
4    Task 2  13589     Finish
2 голосов
/ 27 мая 2020

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

>>> df[df.apply(lambda row: row.astype(str).str.contains("Start|Task", case=False, na=False).any() & row.astype(str).str.contains("Finish", case=False, na=False).any(), axis=1)]
       Task     ID Supervisor
2  Starting            Finish
4    Task 2  13589  Finishing

То есть использовать & побитовый оператор AND с двумя вызовами str.contains, один ищет Start или Task без учета регистра (из-за на case=False), а другой ищет Finish.

0 голосов
/ 27 мая 2020

попробуйте это,

import re

# required because there are integer columns in the dataframe.
df = df.astype(str)

compile_ = re.compile("^Start.*Finish.*$|^Task.*Finish.*$", re.IGNORECASE)
mask = df.apply(lambda x : True if compile_.search("".join(x)) else False, axis=1)

print(df[mask])

вывод,

       Task     ID Supervisor
2  Starting            Finish
4    Task 2  13589     Finish
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...