【问题标题】:Using f-string and raw string at same time同时使用 f-string 和 raw string
【发布时间】:2021-10-01 23:59:34
【问题描述】:

我有一个这样的数据框:

           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
"""

想法:
我们可以像(?(<month name>)<number>) 一样使用regex if 吗?pandas 中任何可以检测到任何01JAN2020 的函数都将其替换为01-01-2020

预期输出为:

           p           q
0      jdkdn  01-01-2020
1 01-01-2020    hdk789dj
2      783i3  01-02-2020

【问题讨论】:

    标签: python regex pandas f-string rawstring


    【解决方案1】:

    您可以使用 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, repl, x))
    

    如果您的数据重复,一种有效的方法是转换为分类并将字符串修改应用于类别;那应该更快。

    请注意,空值被 pandas 字符串函数隐式覆盖,在 python 中,您的代码应该涵盖这些可能的场景。

    【讨论】:

    • 是的!性能是必要的,因为我必须为 20M 的文件做这项工作。
    • 对不起,我忘了做df=df.transform(lambda x: 我刚刚复制/粘贴,现在意识到你正在打印df.transform(lambda x: 是的!它工作得很好。和性能? 在python中并应用是什么意思?
    • applyapplymap 之间的主要区别?因为我刚刚测试过,并且只使用apply 也很适合我。
    • applymap 击中每个单元格,对整个列或行应用交易...再次您应该测试每个的性能...如果您真的关心...但不要担心微秒差异
    • 其实.apply()tranform()
    猜你喜欢
    • 1970-01-01
    • 2020-09-27
    • 2010-12-29
    • 2022-08-12
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    相关资源
    最近更新 更多