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



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

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

非常感谢您的建议:)

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

发生这种情况是因为默认情况下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

您可以稍微调整一下代码。我会首先拆分"代码"列,然后将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,因为它会返回部分匹配,顾名思义,而不是精确匹配。

相关内容

  • 没有找到相关文章

最新更新