【问题标题】:Python using regex to extract parts of a string in pandas columnPython使用正则表达式在熊猫列中提取部分字符串
【发布时间】:2017-12-08 21:18:49
【问题描述】:

我有一个名为“Raw”的 pandas df 列,其格式不一致。它包含的字符串如下所示:

'(1T XXX, Europe)'
'(2T YYYY, Latin America)'
'(3T ZZ/ZZZZ, Europe)'
'(4T XXX XXX, Africa)'

“Raw”中的字符串唯一一致的是它们以数字开头,中间包含一个逗号,后跟一个空格,并且还包含括号。

现在,我想在我的数据框中创建两个额外的列(模型和区域):

  • 'Model' 将包含字符串的开头,即第一个括号和逗号之间的所有内容
  • 'Region' 将包含字符串的结尾,即逗号后的空格和最后的括号之间的所有内容

如何使用正则表达式来做到这一点?

【问题讨论】:

    标签: python regex string pandas


    【解决方案1】:

    你可以试试下面的:

    示例数据帧:

    df
                            raw
    0          (1T XXX, Europe)
    1  (2T YYYY, Latin America)
    2      (3T ZZ/ZZZZ, Europe)
    3      (4T XXX XXX, Africa)
    

    解决方案 1:

    使用str.extractregex

    df = df.raw.str.extract(r'\((.*), (.*)\)').rename(columns={0:'Model', 1:'Region'})
    print(df)
            Model         Region
    0      1T XXX         Europe
    1     2T YYYY  Latin America
    2  3T ZZ/ZZZZ         Europe
    3  4T XXX XXX         Africa
    

    解决方案 2:

    str.replace()+str.split()rename

    df = df.raw.str.replace('[(|)]' , '').str.split(',', expand=True).rename(columns={0:'Model', 1:'Region'})
    print(df)
            Model          Region
    0      1T XXX          Europe
    1     2T YYYY   Latin America
    2  3T ZZ/ZZZZ          Europe
    3  4T XXX XXX          Africa
    

    注意:

    但是,如果你想同时保留原来的Column,你可以选择下面的方法:

    df[['Model', 'Region' ]] = df.raw.str.replace('[(|)]' , '').str.split(',', expand=True)
    
    print(df)
                            raw       Model          Region
    0          (1T XXX, Europe)      1T XXX          Europe
    1  (2T YYYY, Latin America)     2T YYYY   Latin America
    2      (3T ZZ/ZZZZ, Europe)  3T ZZ/ZZZZ          Europe
    3      (4T XXX XXX, Africa)  4T XXX XXX          Africa
    

    df[['Model', 'Region' ]] = df.raw.str.extract(r'\((.*), (.*)\)')
    print(df)
                            raw       Model         Region
    0          (1T XXX, Europe)      1T XXX         Europe
    1  (2T YYYY, Latin America)     2T YYYY  Latin America
    2      (3T ZZ/ZZZZ, Europe)  3T ZZ/ZZZZ         Europe
    3      (4T XXX XXX, Africa)  4T XXX XXX         Africa
    

    【讨论】:

      【解决方案2】:

      如果逗号是字符串部分的可靠分隔符,则不需要正则表达式。如果 df 是您的数据框:

      df['Model'] = [x.split(',')[0].replace('(', '') for x in df['Raw']]
      df['Region'] = [x.split(',')[1].replace(')', '') for x in df['Raw']]
      

      如果你想使用正则表达式,它看起来像:

      s = '(1T XXX, Europe)'
      m = re.match('\(([\w\s]+),([\w\s]+)\)', s)
      model = m.group(1)
      region = m.group(2)
      

      【讨论】:

        【解决方案3】:
        string_list = ['(1T XXX, Europe)',
        '(2T YYYY, Latin America)',
        '(3T ZZ/ZZZZ, Europe)',
        '(4T XXX XXX, Africa)']
        df = pd.DataFrame(string_list)
        df = df[0].str.extract("\(([^,]*), ([^)]*)\)", expand=False)
        

        【讨论】:

          【解决方案4】:
          Model=re.findall(r"(?<=\().+(?=\,)",s)
          Region=re.findall(r"(?<=\, ).+(?=\))",s)
          

          第一个正则表达式检查模型前面的左括号“(”和结束的“,”。第二个正则表达式检查“,”和“)”之间的任何字符串。

          【讨论】:

            【解决方案5】:

            由于只有一个逗号,并且所有内容都在括号之间,因此在您的情况下,在适当切片后使用.str.split()

            model_region = df.Raw.str[1:-1].str.split(', ', expand = True)
            

            但如果你坚持:

            model_region = df.Raw.str.extract('\((.*), (.*)\)', expand = True)
            

            然后

            df['Model'] = model_region[0]
            df['Region'] = model_region[1]
            

            【讨论】:

              【解决方案6】:
              import re
              
              s = '(3T ZZ/ZZZZ, Europe)'
              m=re.search(r'\((.*), (.*)\)',s)
              print(m.groups())
              

              【讨论】:

                【解决方案7】:

                试试这个:\(([^,]*), ([^)]*)\)

                见:https://regex101.com/r/fCetWg/1

                【讨论】:

                  猜你喜欢
                  • 2018-08-28
                  • 2019-06-16
                  • 1970-01-01
                  • 2021-03-06
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-12-31
                  • 1970-01-01
                  • 2022-01-10
                  相关资源
                  最近更新 更多