如何解决同时使用 f-string 和 raw string
p q
0 jdkdn 01JAN2020
1 01JAN2020 hdk789dj
2 783i3 01FEB2020
我正在尝试将 01JAN2020
替换为 01-01-2020
,基本上是将 alphabetical month name
替换为 numeric month number
。我不知道这些 date
在哪里,意味着在任何列和任何行中。我试图通过仅使用 df.replace
来做到这一点,但原始字符串有问题,我也想使用 f-string。
这是我的尝试:
import pandas as pd
import re
df=pd.DataFrame({"p":["jdkdn","01JAN2020","783i3"],"q":["01JAN2020","hdk789dj","01FEB2020"]})
months = {'JAN': '01','FEB': '02'}
#All 12 months but for test I am using just 2
df.replace(r'(\d{2})('+'|'.join(months)+')(\d{4})',r"\1-"+
f"{{months[\\2]}}" # Here I am trying to do main things
+r"-\3",regex=True,inplace=True)
print(df)
"""
p q
0 jdkdn 01-{months[JAN]}-2020
1 01-{months[JAN]}-2020 hdk789dj
2 783i3 01-{months[FEB]}-2020
"""
fr"{{months[\\2]}}"
"""
p q
0 jdkdn 01-{months[\2]}-2020
1 01-{months[\2]}-2020 hdk789dj
2 783i3 01-{months[\2]}-2020
"""
rf"{months[\2]}" and rf"{months[\\2]}"
"""
SyntaxError: f-string expression part cannot include a backslash
"""
想法:
我们可以像 regex if
一样使用 (?(<month name>)<number>)
吗?pandas 中的任何函数都会检测到任何 01JAN2020
将其替换为 01-01-2020
。
预期输出为:
p q
0 jdkdn 01-01-2020
1 01-01-2020 hdk789dj
2 783i3 01-02-2020
解决方法
你可以使用pandas str。替换,只需创建一个带有名称和替换的模式,然后使用 transform
将其应用于所有列:
pat = r"(?P<day>\d+)(?P<month>[A-Z]+)(?P<year>\d+)"
repl = lambda m: f"{m.group('day')}-{months[m.group('month')]}-{m.group('year')}"
df.transform(lambda x: x.str.replace(pat,repl,regex=True))
p q
0 jdkdn 01-01-2020
1 01-01-2020 hdk789dj
2 783i3 01-02-2020
请注意,对于字符串,如果您想要更高的性能,可以在 python 中编写并应用。您可以为此使用 re.sub
,它应该会带来显着的改进(请测试):
df.applymap(lambda x: re.sub(pat,x))
如果您的数据重复,一种有效的方法是转换为 Categorical 并将字符串修改应用于类别;那应该更快。
请注意,pandas 字符串函数隐式覆盖了空值,在 python 中,您的代码应该涵盖这些可能的场景。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。