【问题标题】:How to effeciently remove character if available at the beginning and end of a string in Pandas?如果在 Pandas 中字符串的开头和结尾可用,如何有效地删除字符?
【发布时间】:2020-11-07 23:00:29
【问题描述】:

这个想法是删除句号、逗号、引号(如果它在 Pandas 的开头和最后一个字符串中可用)。

给定一个df 如下

data = {'Name': ['"Tom hola.', '"nick"', 'krish here .','oh my *']}

预期的输出是

Tom hola
nick
krish here
oh my

我尝试了以下代码,但它没有按预期工作

import pandas as pd
df = pd.DataFrame(data)
df['Name'] = df['Name'].str[-1:].replace({"\. ": "Na"},regex=True)

我可以知道如何实现这个目标吗?

此外,该方法是否可以扩展以应用于不同的列?

【问题讨论】:

    标签: python pandas replace


    【解决方案1】:

    如果您只想替换列,可以使用pd.Series.str.replace,否则使用df.replace

    # Using `pd.Series.str.replace`
    df['Name'] = df['Name'].str.replace(r'\.$','')
    df          Name
    0     Tom hola
    1   secondx //
    2         nick
    3  krish here
    
    # Using `df.replace`
    df.replace(r'\.$', '', regex=True)
              Name
    0     Tom hola
    1   secondx //
    2         nick
    3  krish here
    

    编辑:

    您可以使用pd.Series.str.strip 剥离".*

    df['Name'].str.strip(r'\"\.\*')
    
    0       Tom hola
    1           nick
    2    krish here
    3         oh my
    Name: Name, dtype: object
    
    # OR
    df.Name.str.replace(r'^\W+|(.*?)\W+$',r'\1') # Replaces only values in `Name`
    # df.replace(r'^\W+|(.*?)\W+$',r'\1',regex=True) Replaces for whole df
    
    • 更多关于在第二种情况下使用的正则表达式模式here

    【讨论】:

    • 谢谢@Ch3steR。我想扩展这种方法,以便它也可以删除符号"。但是将r'\.$' 替换为r'\"$' 什么都不做。另外,如果$ 表示字符串的结尾,是否有任何特殊符号表示第一个字符串?
    • 是的,使用^ 作为字符串的开头。 @balandongiv
    • 感谢@Ch3steR 的及时回复。但是,在使用df.replace(r'\"$', '', regex=True) 时,仍然无法替换存在于字符串末尾的开头引号。这也适用于使用 df.replace(r'\"^', '', regex=True) 在前面删除相同的特殊字符
    • @balandongiv 编辑了答案。看看有没有帮助。 ;) 如有任何疑问,请随时询问。
    • @balandongiv 添加了另一种选择。不是正则表达式专家,可能存在比我发布的更多的正则表达式,但这应该可以帮助您入门。
    【解决方案2】:

    如果要匹配字符串末尾的所有特殊字符,请使用(\W)*$

    df = pd.DataFrame({'Name': ['Tom hola.', 'secondx //', 'nick', 'krish here .']})
    df['Name'] = df['Name'].replace({r'(\W)*$': ""}, regex=True)
    

    输出:

             Name
    0     Tom hola
    1    secondx 
    2        nick
    3  krish here
    

    您可以使用https://regex101.com 测试并更好地了解您的正则表达式在做什么

    【讨论】:

    • 感谢您的回复,为了让这种方法更进一步,我将{r'(\W)*$': ""} 替换为{r'(\W)*^': ""} 以删除开头的特殊字符,但是它没有按预期工作。跨度>
    • 要删除开头你可以使用r'^(\W)*'。如果你想同时做这两个:^(\W)*|(\W)*$
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多