【问题标题】:Extracting the project number with python regex使用 python 正则表达式提取项目编号
【发布时间】:2019-12-16 06:27:49
【问题描述】:

大家好。我想从project_name 列中提取斜线符号后的最后一位数字。目前,我正在研究它,但有一些问题如下:

  1. 如何提取斜线符号后面的最后一位数字而不得到带有方括号的结果?因为现在我的代码几乎可以工作,但结果中总是有方括号

我的代码:

def project_name(name):
    return re.findall(r'\d{3}$',name)

data['project_name'] = data['project_name'].apply(project_name)

数据:

project_name    
 ----------
   ASAHI,PT-PRO/PTN/06-2012/192          
   CIMB NIAGA-PRO/PTN/06-2012/174        
   FRAMAS INDONESIA-PRO/PTN/06-2012/210    
   DM STOCK 2015   
   PERBAIKAN OH TM 366 PLANT DAWUAN 
   Ruko-PRO/PTN/03-2012/47

我的输出:

 (Expected)project_name   
 ----------     
   192            
   174            
   210            
   NaN
   NaN            
   NaN            
    47            

感谢所有建议和意见。谢谢大家

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    使用Series.str.extract 并将/ 添加到正则表达式:

    data['project_name'] = data['project_name'].str.extract(r'/(\d{3}$)')
    print (data)
      project_name
    0          192
    1          174
    2          210
    3          NaN
    4          NaN
    5          NaN
    6          NaN
    

    findall 的解决方案:

    data['project_name'] = data['project_name'].str.findall(r'/(\d{3}$)').str[0]
    

    如果不匹配,您的解决方案应该更改为 nextiter 以返回默认值 np.nan

    def project_name(name):
        return next(iter(re.findall(r'/(\d{3})$',name)), np.nan)
    
    data['project_name'] = data['project_name'].apply(project_name)
    print (data)
      project_name
    0          192
    1          174
    2          210
    3          NaN
    4          NaN
    5          NaN
    6          NaN
    

    【讨论】:

    • 嗨,是的,现在它工作了,但我刚刚意识到,由于原始数据集的格式差异,在较低的行中我有一个奇怪的输出。我会更新我的问题并展示它的外观
    • 我已经更新了我想要获得的数据集、当前输出和预期输出。因为我只想得到斜线符号后面的 3 位数字。有时有不同的项目名称格式,中间有 3 个数字,我不想包含它
    • 好的,我是这样搞定的,现在它按我的预期工作了。非常感谢您的精彩解释
    【解决方案2】:

    而不是

    def project_name(name):
        return re.findall(r'\d{3}$',name)
    

    使用

    def project_name(name):
        return re.findall(r'\d{3}$',name)[0]
    

    【讨论】:

      【解决方案3】:

      由于列表中的值只有一个,我们可以返回0th索引的值

      def project_name(name):
          return re.findall(r'\d{3}$',name)[0]
      
      data['project_name'] = data['project_name'].apply(project_name)
      

      【讨论】:

      • 解释需要连同答案一起提供
      猜你喜欢
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 2013-04-04
      • 2017-02-28
      相关资源
      最近更新 更多