剥离熊猫列中特定字符左侧的字符

Posted

技术标签:

【中文标题】剥离熊猫列中特定字符左侧的字符【英文标题】:Strip characters to the left of a specific character in a pandas column 【发布时间】:2021-07-28 13:51:05 【问题描述】:

我有以下数据:

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(),但我无法找出正确的正则表达式来达到预期的结果。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

使用您展示的示例,请尝试以下操作。在这里使用 Pandas 的replace 功能。简单的解释是,将 Pandas 的 replace 函数应用于数据框的 German 列,然后使用正则表达式 ^[0-9]+:-\s+ 将值替换为 NULL。

df['German'].replace('(^[0-9]+:-\s+)','', regex=True)

解释:

^[0-9]+:匹配起始数字,后跟冒号。 :-\s+:匹配冒号,后跟 -,后跟 1 个或多个空格。

【讨论】:

谢谢,您介意解释一下正则表达式吗? @ojp,肯定会在答案中添加详细说明以及文档链接,干杯。【参考方案2】:

如果只使用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+ 个文字空格字符。

这是一个在线demo

【讨论】:

所以这确实有效,谢谢。但我想了解正则表达式的实现,因为我在那个领域有点生疏。 感谢分享,非常适合以后参考 @ojp,很公平,我已经编辑了答案以包含正则表达式。【参考方案3】:

你需要

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

查看regex demo 和regex graph:

详情

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

【讨论】:

嗨@Wiktor。感谢您分享此正则表达式演示并提供详细说明。这真的很有帮助。 接受这个答案,因为附加的资源是优秀的。【参考方案4】:

提取紧邻不需要字符左侧的任何非空白\S 和非数字\D

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

【讨论】:

以上是关于剥离熊猫列中特定字符左侧的字符的主要内容,如果未能解决你的问题,请参考以下文章

熊猫字符串按字符转换为整数

检查字符串是不是在熊猫数据框中

在熊猫中剥离时区信息

组合替换熊猫列中的字符串[重复]

在熊猫的列中存储字符串值数组? [复制]

从熊猫列中获取字符串值