【问题标题】:Deleting all text starting with a specific string in a pandas series删除以熊猫系列中特定字符串开头的所有文本
【发布时间】:2021-02-20 13:45:18
【问题描述】:

我有以下名为“places”的df

                   place_name
0                 "Palais et bâtiments officiels[modifier | modifier le code]"
1                 "Lieux de culte renommés[modifier | modifier le code]"
2                 "Vestiges gallo-romains[modifier | modifier le code]"

如您所见,有一个类似的子字符串 [修饰符 |在places["place_name] 的所有输入中添加修饰符 le code],我想删除子字符串。

我尝试了以下两种技术

places["place_name"] = places["place_name"].apply(lambda x: re.sub("\\[modifier \\| modifier le code\\]", "", x))

places["places_name"] = places["place_name"].str.replace("[modifier | modifier le code]", "", regex=False) 

这些都不起作用,因为我认为问题是我要删除的子字符串被另一个子字符串卡住了(注意开头没有空格)所以我认为代码本身不能将其识别为字符串.我一直在尝试使用 split() 方法拆分它,但我遇到了同样的问题,因为我要删除的字符串的开头没有空格。

最终输出应该是

                   place_name
0                 "Palais et bâtiments officiels"
1                 "Lieux de culte renommés"
2                 "Vestiges gallo-romains"

我试图寻找其他解决方案但找不到任何解决方案,我知道有很多关于字符串的问题但找不到具体的解决方案。

【问题讨论】:

    标签: python regex pandas string substring


    【解决方案1】:

    你应该使用Series.str.split:

    places["place_name"] = places["place_name"].str.split('\\[modifier').str[0]
    

    基本上,在'[modifier' 上拆分您的字符串并选择第一个值([0]]

    【讨论】:

    • @aramis 您可以使用 "[modifier"rsplit,因为它不使用正则表达式,而且字符串中只有一个 [modifier,请参阅我的回答以及更多解决方案。
    【解决方案2】:

    我建议

    1. 从 0+ 空格和 [modifier 开始删除所有内容:
    places["place_name"].str.replace(r'\s*\[modifier.*', '')
    

    这里,\s* 匹配 0+ 个空格,\[ 匹配 [modifier.* 匹配 modifier,然后尽可能多地匹配除换行符之外的任何 0+ 个字符。

    this regex demo

    1. 提取从字符串开头到第一个[的所有文本:
    places["place_name"] = places["place_name"].str.extract(r'^([^][]+)', expand=False)
    

    请参阅regex demo详情

    • ^ - 字符串开头
    • ([^][]+) - 捕获组 1(Seris.str.extract 要求捕获组返回任何值):一个或多个除 ][ 之外的字符。

    熊猫测试:

    >>> import pandas as pd
    >>> places = pd.DataFrame({'place_name':["Palais et bâtiments officiels[modifier | modifier le code]","Lieux de culte renommés[modifier | modifier le code]","Vestiges gallo-romains[modifier | modifier le code]"]})
    >>> places["place_name"] = places["place_name"].str.extract(r'^([^][]+)', expand=False)
    >>> places
                          place_name
    0  Palais et bâtiments officiels
    1        Lieux de culte renommés
    2         Vestiges gallo-romains
    
    >>> places["place_name"].str.replace(r'\s*\[modifier.*', '')
    0    Palais et bâtiments officiels
    1          Lieux de culte renommés
    2           Vestiges gallo-romains
    

    如果您更喜欢split,您可以使用Seris.str.rsplit,它使用文字字符串,而不是正则表达式:

    >>> places["place_name"].str.rsplit('[modifier').str[0]
    0    Palais et bâtiments officiels
    1          Lieux de culte renommés
    2           Vestiges gallo-romains
    

    【讨论】:

    • 非常感谢您的广泛回答,这对这项任务非常有用,但也扩展了我对正则表达式的了解
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多