【问题标题】:Pandas: How to replace an int substring with another valuePandas:如何用另一个值替换一个 int 子字符串
【发布时间】:2021-04-09 21:29:16
【问题描述】:

我想将字符串中的第一个整数减 1

我有以下数据框:

No              pl.     Expected              
B2bb-hb        0.56     0.35      
F378cq-h1      0.21     0.62   
W30mm2-fpr2    8.17     0.76    
Z51mm1-yu2     2.81     0.91     

我希望输出是:

No              pl.     Expected              
B1bb-hb        0.56     0.35      
F377cq-h1      0.21     0.62   
W29mm2-fpr2    8.17     0.76    
Z50mm1-yu2     2.81     0.91  

我尝试了以下代码:

df['No'] = df['No'].str.replace('(\d+)','(\d+)-int(1)')

但我最终得到了:

No                       pl.     Expected              
B(\d+)-int(1)b-h         0.56     0.35      
F(\d+)-int(1)cq-h1       0.21     0.62   
W(\d+)-int(1)mm2-fpr2    8.17     0.76    
Z(\d+)-int(1)mm1-yu2     2.81     0.91  

请问如何修改代码?

提前致谢!

【问题讨论】:

    标签: python arrays regex pandas replace


    【解决方案1】:

    我们可以在这里尝试使用 str.replace 与 lambda 函数:

    repl = lambda m: m.group(1) + str(int(m.group(2)) - 1) + m.group(3)
    df['No'] = df['No'].str.replace(r'^([^\W\d]*?)(\d+)(\w*)\b', repl)
    

    【讨论】:

      【解决方案2】:

      pandas.Series.str.replacelambdan 一起使用的一种方式:

      df["No"].str.replace("(\d+)", lambda x: str(int(x.group(1))-1), n=1)
      

      输出:

      0        B1bb-hb
      1      F377cq-h1
      2    W29mm2-fpr2
      3     Z50mm1-yu2
      Name: No, dtype: object
      

      【讨论】:

      • h1 改为 h0
      • @Chris 感谢您的回答,它成功了!您能否解释一下 group(1) 的作用,以及为什么需要 n=1?提前致谢!
      • @cave 在正则表达式捕获组(\d+),第一组是匹配的数字。然后lambda 操作使用第一组(3022 用于第 2 行)并执行操作(即将它们转换为 int 并减去 1)。 n 参数用于限制此操作只执行一次,因此只减去第一个数字,其余数字保持不变。
      • @Chris 感谢您的解释!还有一个问题,(30,2,2) 在第一组中代表什么?
      • @cave 数字 ;) W30mm2-fpr2
      猜你喜欢
      • 2014-12-23
      • 2017-01-28
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      • 2011-06-06
      • 2013-12-03
      相关资源
      最近更新 更多