Python中使用的模式匹配错误Pandas.series.str。包含字符串替换项

2024-03-28 18:28:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用从包含多组括号的字典中提取的字符串替换pandas数据帧中的字符串。运行脚本时,匹配组出现错误,字符串未被替换。我很有信心这个错误是由括号引起的。

为了解决这个问题,我一直在尝试使用正则表达式模式匹配结构包含()方法。我已经查看了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)

有人能提供关于使用模式匹配的指导,以便正确地替换字符串吗?

谢谢!


Tags: 字符串import脚本pandasdfinitas错误
3条回答

谢谢你的快速反应。我的代码比我发布的代码要复杂一点,而且我实际上是在匹配字符而不是数字。我修改了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)

对于像我这样的初学者来说,正则表达式how to documentation是必须的(https://docs.python.org/3/howto/regex.html#regex-howto

干杯

不要使用变量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

你试过不涉及循环的方法吗?在这个方向上的东西:

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)

相关问题 更多 >