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' 列,然后将 isin
与 any(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
我有一个数据集,我在其中尝试 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' 列,然后将 isin
与 any(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