我试图用从包含多组括号的字典中提取的字符串来替换熊猫数据框中的字符串。运行脚本时,匹配组出现错误,并且未替换字符串。我完全有信心此错误是由括号引起的。
为解决此问题,我一直在尝试通过str.contains()方法使用正则表达式模式匹配。我已经查看了关于stackoverflow的其他解决方案,但是未能成功解决我的错误。
这是我用于测试目的的一些脚本。在字符串中保留括号非常重要(也就是说,我不必删除它们):
import pandas as pd
import numpy as np
dict= {'2017() (pat)':'2000',
'2018() (pat)':'2001'}
df = pd.DataFrame({'YEAR': ['test2017end','test2018end','test2019end'],
'MONTH': ['Jan','Feb','Mar'],
'DD': ['1','12','22']})
for init, repl in dict.items():
df.loc[df['YEAR'].str.contains(init),'YEAR'] = repl
print(df)
有人可以提供使用模式匹配的指导,以便正确替换字符串吗?
谢谢!
答案 0 :(得分:1)
不要使用变量dict
,因为使用python代码关键字。
解决方案是从字典的键中提取第一个整数:
import re
d= {'2017() (pat)':'2000',
'2018() (pat)':'2001'}
df = pd.DataFrame({'YEAR': ['test2017end','test2018end','test2019end'],
'MONTH': ['Jan','Feb','Mar'],
'DD': ['1','12','22']})
for init, repl in d.items():
i = re.findall('\d+', init)[0]
df.loc[df['YEAR'].str.contains(i),'YEAR'] = repl
print(df)
YEAR MONTH DD
0 2000 Jan 1
1 2001 Feb 12
2 test2019end Mar 22
答案 1 :(得分:0)
您是否尝试了不涉及循环的方法?朝着这个方向前进:
import re
import pandas as pd
dict_= {'2017() (pat)':'2000',
'2018() (pat)':'2001'}
df = pd.DataFrame({'YEAR': ['test2017end','test2018end','test2019end'],
'MONTH': ['Jan','Feb','Mar'],
'DD': ['1','12','22']})
pat = r'(\d{4,4})'
dict_b = {re.search(pat, key).group(1):item for key, item in dict_.items()}
# Return NaN for no match
df['YEARX'] = df['YEAR'].str.extract(pat,expand=False).map(dict_b)
# Return found year for no match
df['YEARY'] = df['YEAR'].str.extract(pat,
expand=False).apply(lambda x: dict_b[x] if x in dict_b.keys() else x)
答案 2 :(得分:0)
感谢您的快速回复。我的代码比我发布的代码复杂一点,实际上我是在匹配字符而不是数字。我为此修改了jerzael的响应,并且脚本正常运行。这是我使用的测试脚本:
import pandas as pd
import numpy as np
import re
dct= {'love (one)()':'john',
'smith (two)()':'doe',
'ken (three)()':'yearns'}
df = pd.DataFrame({'MAN': ['test|smith (two)()end','test|love (one)()end','test|ken (three)()end'],
'MONTH': ['Jan','Feb','Mar'],
'DD': ['1','12','22']})
for init, repl in dct.items():
i = re.findall(r'\w+', init)[0]
df.loc[df['MAN'].str.contains(i),'MAN'] = repl
print(df)
对于像我这样的初学者来说,如何记录正则表达式是必须的(https://docs.python.org/3/howto/regex.html#regex-howto)
欢呼