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

【问题讨论】:

    标签: python-3.x regex pandas


    【解决方案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 demoregex graph

    详情

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

    【讨论】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 2018-04-20
      相关资源
      最近更新 更多