如何在python中匹配两个字符串的组合来寻找行的索引?

问题描述 投票:0回答:3

我想在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']

这是我的尝试。例如,我想得到包含以下两个字符串的行的索引。startfinishtaskfinish

下面是我的尝试。

    findrowindex = df[df.apply(lambda row: 
row.astype(str).str.contains(r'\b(?:start&finish|task&Finishing)\b').any(), axis=1)].index
python regex pandas
3个回答
0
投票

试试这个。

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

2
投票

您可以使用

>>> 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

也就是说,使用 & 位与运算符,两次调用 str.contains,一个人在寻找 StartTask 不区分大小写(由于 case=False),另一个搜索 Finish.


2
投票

你可以使用。

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
© www.soinside.com 2019 - 2024. All rights reserved.