【问题标题】:How to format text in a pandas data frame如何在熊猫数据框中格式化文本
【发布时间】:2018-10-23 11:51:50
【问题描述】:

我有一个熊猫数据框:

df

id  Description
1   2694 A&W #5530 MONTREAL QC
2   ahi DOLLARAMA # 45 MONTREAL QC
3   PC - PAYMENT FROM - *****11*22

我想格式化这个数据框,这样df["Description"] 的列就没有#-*numbers 之类的:

id  Description

1   A&W MONTREAL QC
2   ahi DOLLARAMA MONTREAL QC
3   PC PAYMENT FROM

我尝试使用 python 模块 re.但我完全错了。

谢谢

【问题讨论】:

    标签: python regex string pandas text


    【解决方案1】:

    尝试像这样使用正则表达式:

    df.Description = df.Description.str.replace(r'[\d#\-\*]', '')
    

    这给了

    0               A&W  MONTREAL QC
    1    ahi DOLLARAMA   MONTREAL QC
    2             PC  PAYMENT FROM  
    Name: foo, dtype: object
    

    【讨论】:

    • 问题是,这不考虑行首的数字。
    • @Graham 你为什么这么认为?我认为它适用于我的示例。
    • 嗯。我可能误解了 Panda 数据框。
    • 我仍然认为 OP 希望根据他们的示例删除尾随空格,因此 df.Description = df.Description.str.replace(r'[-#*\d]+ ?, '') 可能更适合 OP 所需的行为。
    • 我删除了我的,因为它不是特定于实际提出的问题,以至于在给定某些输入时它实际上执行错误。我本可以编辑我的答案,但你的答案完美地完成了 OP(以及我想象中会偶然发现这个问题的任何人)正在寻找的内容。
    【解决方案2】:

    您可以使用pandas .applyre.sub 删除[^A-Z ]+,即:

    import pandas as pd
    import re
    test = ['2694 A&W #5530 MONTREAL QC', 'ahi DOLLARAMA # 45 MONTREAL QC', 'PC - PAYMENT FROM - *****11*22']
    
    def change_me(content):
        content =  re.sub(r"[^A-Z ]+", "", content, 0, re.IGNORECASE)
        return re.sub(r"[ ]{2,}", " ", content, 0, re.IGNORECASE)
    
    df = pd.DataFrame({'Desc':test})
    df.Desc = df.Desc.apply(change_me)
    

                            Desc
    0             AW MONTREAL QC
    1  ahi DOLLARAMA MONTREAL QC
    2            PC PAYMENT FROM
    

    Regex Demo and Explanation


    PS:
    请阅读@ami 的评论,.str.replace() 是适合此类任务的函数。

    【讨论】:

    • 这种多余的apply 在 Pandas 中是非常不鼓励的。这就是为什么会有像.str 这样的操作。
    猜你喜欢
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2020-08-03
    相关资源
    最近更新 更多