【问题标题】:Select rows that match exactly with string contain选择与字符串完全匹配的行包含
【发布时间】:2026-02-02 15:50:01
【问题描述】:

我有一个数据集,我尝试只选择与列表中定义的字符串完全匹配的行。

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 相应地选择行,但是这样我得到的行与字符串不完全匹配。

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]})

非常感谢您的建议:)

【问题讨论】:

    标签: python pandas contains


    【解决方案1】:

    我得到的行与字符串不完全匹配。

    这是因为默认情况下Series.str.contains 假定第一个参数是正则表达式模式,而在正则表达式中,点 . 匹配任何单个字符。要匹配文字.,您必须对其进行转义(即\.)。不需要指定na=False btw。

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

    【讨论】:

      【解决方案2】:

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

      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,因为这会返回部分匹配项,顾名思义,而不是完全匹配项。

      【讨论】:

      • 非常感谢您的回答,它运行良好。您是否还知道是否也可以使用 str.contains() 和正则表达式来执行此操作?
      • 酷,欢迎。 regex 需要一个模式来识别。您要过滤的值是否存在模式?
      • 是的,我试图在我的数据框中过滤的所有字符串都以“R:”+ 2-4 个字母开头并以一个点结尾。例如 ['R:SEW.', 'R:FK.', 'R:WOLH.']