删除以熊猫系列中特定字符串开头的所有文本

Posted

技术标签:

【中文标题】删除以熊猫系列中特定字符串开头的所有文本【英文标题】: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"

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

【问题讨论】:

【参考方案1】:

你应该使用Series.str.split:

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

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

【讨论】:

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

我建议

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

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

见this regex demo。

    提取从字符串开头到第一个[的所有文本:
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

【讨论】:

非常感谢您的广泛回答,这对这项任务非常有用,但也扩展了我对正则表达式的了解

以上是关于删除以熊猫系列中特定字符串开头的所有文本的主要内容,如果未能解决你的问题,请参考以下文章

急!如何批量删除数据库中以特定字符开头和结尾的字符串

删除所有以某个字符串开头的类

如何避免以特定符号开头的行中字符串的文本突出显示[java]

如何配置机器人删除发送到特定频道的消息,除非它以特定字符串开头?

删除熊猫数据框中具有特定值的行[重复]

如果系列的值包含pandas中的特定字符集,则替换后续字符