在 Pandas 列中,删除特定字符左侧的所有字符

3

我有以下数据:

key German
0   0:- Profile 1
1   1:- Archetype   Realist*in
2   2:- RIASEC Code:    R- Realistic
3   3:- Subline Deine Stärke? Du bleibst dir selber treu.
4   4:- Copy    Dein Erfolg basiert auf deiner praktischen Ver...

在“键”列中,我希望删除后面的数字、冒号和短划线。这个顺序总是相同的(从左边开始)。因此,对于第一行,我想删除“0:-”,只留下“Profile 1”。我正在努力查找正确的正则表达式来实现我的要求。最初,我尝试了以下内容:
df_json['key'] = df_json['key'].map(lambda x: x.strip(':- ')[1])

然而,这种方法过于严格,因为字段中可能有多个单词。

我想使用pd.Series.str.replace(),但我无法找到正确的正则表达式来实现所需的结果。任何帮助将不胜感激。

4个回答

5
请尝试使用您展示出的样本,使用Pandas的replace函数。简单解释一下,将Pandas的replace函数应用于数据帧的German列,然后使用正则表达式^[0-9]+:-\s+将值替换为NULL。
df['German'].replace('(^[0-9]+:-\s+)','', regex=True)

说明:

  • ^[0-9]+:匹配冒号后的数字开头。
  • :-\s+:匹配冒号,后跟 -,然后是 1 个或多个空格出现。

谢谢,您介意解释一下正则表达式吗? - ojp
1
@ojp,当然,详细的解释和文档链接已经添加到答案中了,干杯。 - RavinderSingh13

3

使用 pandas.Series.str.partition 来代替正则表达式,怎么样?

df['German'] = df['German'].str.partition()[2]

这将仅在第一个空格处分割该系列并获取其后部分。与分区不同,您也可以只拆分:
df['German'] = df['German'].str.split(' ', 1).str[1]

如果你必须使用正则表达式,也许可以使用懒惰量词来匹配第一个空格字符之前的内容:
df['German'] = df['German'].replace('^.*? +','', regex=True)

含义:

  • ^ - 行的开始锚点。
  • .*? - 除了换行符之外的任何0+(懒惰匹配)字符,直到;
  • + - 1个或多个字面量空格字符。

这里有一个在线演示


所以这确实有效,谢谢。但我想了解正则表达式的实现,因为我在那方面有点生疏。 - ojp
谢谢分享,这对未来的参考非常有用。 - ojp
1
@ojp,好的,我已经编辑了答案,包括一个正则表达式选项。 - JvdV

2
你需要
df_json['key'] = df_json['key'].str.replace(r'^\d+:-\s*', '', regex=True)

请看正则表达式演示正则表达式图表

enter image description here

细节:
  • ^ - 字符串开头
  • \d+ - 一个或多个数字
  • : - 冒号
  • - - 连字符
  • \s* - 零个或多个空格

嗨@Wiktor。感谢您分享这个正则表达式演示和详细的解释。这真的很有帮助。 - ojp
1
接受此答案,因为附加的资源非常出色。 - ojp

2

提取任何非空白字符 \S 和非数字字符 \D,它们紧挨在不需要的字符左侧

df['GermanFiltered']=df['German'].str.extract("((?<=^\d\:\-\s)\S+\D+)")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接