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

Deleting all text starting with a specific string in a pandas series

我有以下名为“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]"

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

我尝试了以下两种技巧

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) 

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

最终输出应该是

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

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

你应该使用 Series.str.split:

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

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

我建议

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

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

参见 this regex demo

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

regex demo详情:

  • ^ - 字符串开头
  • ([^][]+) - 捕获组 1(Seris.str.extract 需要捕获组 return 任何值):除 ] 和 [=17= 之外的一个或多个字符].

Pandas 测试:

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