Select 与字符串完全匹配的行包含

Select rows that match exactly with string contain

我有一个数据集,我在其中尝试 select 仅行,这些行与列表中定义的字符串完全匹配。

list  = ['P:34.', 'R:ES.'] 

df = pd.DataFrame({
    'Date':['2021-01-01', '2021-01-01', '2021-01-01', '2021-01-02', '2021-01-02', '2021-01-02', '2021-01-02', '2021-01-03'],
    'Code':['P:34. R:ES.', 'R:ESB.', 'K2P:P:341.', 'R:ESZ', 'P:34.', 'R.ES7.', 'P 34 5', 'P:32. R:ES.'], 
    'Ratings':[9.0, 8.0, 5.0, 3.0, 2, 3, 6, 5]}) 

我使用函数 str.contains 来 select 相应的行,但是,我得到的行与字符串不完全匹配。

sample = df[df.Code.str.contains('|'.join(list),na=False)]

我尝试只获取列表中恰好包含字符串(也考虑字符串末尾的点)的行,就像这样:

df_exact_match = pd.DataFrame({
    'Date':['2021-01-01', '2021-01-02', '2021-01-03'],
    'Code':['P:34. R:ES.', 'P:34.', 'P:32. R:ES.'], 
    'Ratings':[9.0, 2, 5]})

非常感谢您的建议:)

您可以稍微调整一下您的代码。我将首先拆分 'Code' 列,然后将 isinany(axis=1) 结合使用,这将允许该列表的任何值包含在您的 'Code' 拆分列中,分为几部分:

l  = ['P:34.', 'R:ES.'] 
df.loc[df['Code'].str.split(expand=True).isin(l).any(1)]

打印:

         Date         Code  Ratings
0  2021-01-01  P:34. R:ES.      9.0
4  2021-01-02        P:34.      2.0
7  2021-01-03  P:32. R:ES.      5.0

给自定义列表 list 命名也不是一个好习惯。最好使用不同的名称。我还建议不要使用 str.contains,因为那样会 return 部分匹配,顾名思义,而不是完全匹配。

I get rows with do not match the strings exactly.

发生这种情况是因为默认情况下 Series.str.contains 假定第一个参数是正则表达式模式,而在正则表达式中,点 . 匹配任何单个字符。要匹配文字 .,您必须将其转义(即 \.)。没有必要指定 na=False 顺便说一句。

>>> l  = ['P:34\.', 'R:ES\.'] 
>>> df[df.Code.str.contains('|'.join(l))]

         Date         Code  Ratings
0  2021-01-01  P:34. R:ES.      9.0
4  2021-01-02        P:34.      2.0
7  2021-01-03  P:32. R:ES.      5.0