检查字符串中是否存在特定的子字符串(存在于数据帧的行中)

时间:2019-07-29 02:30:47

标签: python regex python-3.x pandas dataframe

尝试在pandas数据框的列中找到子字符串。

下面是我的代码

    import pandas as pd

    list1=[1,2,4,5,6,10]

    list2=[3,5,86,7,6,20]

    list3=['ABC , CDE','CDE','XYZ' , 'cde','XYZ , EFG , CDE qw','IJK']

    df1=pd.DataFrame({'col1':list1,'col2':list2,'col3':list3})

    D=df1[df1.col3.str.contains('CDE', case=False)]

    print('\n \n \n ',D)

    print('\n \n \n ',df1)

原始数据框:

col1    col2    col3
1   3   ABC , CDE
2   5   CDE
4   86  XYZ
5   7   cde
6   6   XYZ , EFG , CDE qw
10  20  IJK

输出数据框:

col1    col2    col3
1   3   ABC , CDE
2   5   CDE
5   7   cde
6   6   XYZ , EFG , CDE qw

我需要什么:

col1    col2    col3
1   3   ABC , CDE
2   5   CDE
5   7   cde

我不希望col3具有“ XYZ,EFG,CDE qw”。我希望能够将“ CDE qw”与“ CDE”区分开。

简单地说,我想遍历col3中的字符串并找到确切的字符串。

当我使用D=df1[df1.col3.str.match('CDE', case=False)]而不是D=df1[df1.col3.str.contains('CDE', case=False)]

输出将为

2   5   CDE
5   7   cde

但是我希望有其他包含CDE的行。

我相信我应该对大熊猫使用正则表达式和split。但是我不确定如何遍历大熊猫数据帧的所有子字符串

2 个答案:

答案 0 :(得分:1)

我会去理解列表

mask = [any([sub.lower() == 'cde' for sub in item.split(' , ')]) for item in df1.col3]
df1[mask]

您也可以使用

df1[(pd.DataFrame(df1['col3'].str.lower().str.split(' , ').tolist()) == 'cde').any(1)]

    col1    col2    col3
0   1       3       ABC , CDE
1   2       5       CDE
3   5       7       cde

答案 1 :(得分:0)

您能尝试一下吗?

list1=[1,2,4,5,6,10]
list2=[3,5,86,7,6,20]
list3=['ABC , CDE','CDE','XYZ, CCCDE' , 'cde','XYZ , EFG , CDE qw','CCDE, IJK']
df1=pd.DataFrame({'col1':list1,'col2':list2,'col3':list3})
df1[df1['col3'].str.contains(r'[CDE]$', case=False, regex=True)]

输出:

   col1  col2        col3
0     1     3   ABC , CDE
1     2     5         CDE
2     4    86  XYZ, CCCDE
3     5     7         cde