我有一个数据集,我尝试只选择行,这与列表中定义的字符串完全匹配。
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
您可以稍微调整一下代码。我会首先拆分"代码"列,然后将isin
与any(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
,因为它会返回部分匹配,顾名思义,而不是精确匹配。