【问题标题】:How do I rename the columns of a Pandas DataFrame using Regex?如何使用正则表达式重命名 Pandas DataFrame 的列?
【发布时间】:2021-09-09 05:22:05
【问题描述】:

我有一个数据框,其列名如下所示,其中一些列名在 [] 内具有子字符串

'date', 'customer','region[level1]','priority[s2]','planning[WIP]' ...
 Jan.10,  ABC     ,   East[3]      ,    Normal[1] ,    TBD[WIP]    ...   

我想重命名所有列,以便只保留 [] 中的值。

'date','customer','level1','s2','WIP' ...

我尝试了下面的代码,但不断收到错误代码“NoneType”对象没有属性“组”。哪一部分出了问题?

import re
for i in range(len(df.columns)):
  df.columns.value[i] = [re.match(r"[^[]*\[([^]]*)\]", col_name).groups()[0] for col_name in df.columns]

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    你可以试试str.replace 找到here的正则表达式的详细信息

    df = pd.DataFrame(['date','customer','region[level1]','priority[s2]','planning[WIP]'], columns=['col'])
    
    df['col'].str.replace(r'(.*\[)|(\].*)', '', regex=True)
    
    # 0        date
    # 1    customer
    # 2      level1
    # 3          s2
    # 4         WIP
    # Name: col, dtype: object
    

    更改列名

    df = pd.DataFrame([[1,1,1,1,1]], columns=['date','customer','region[level1]','priority[s2]','planning[WIP]'])
    df.columns = df.columns.str.replace(r'(.*\[)|(\].*)', '', regex=True)
    
    #   date    customer    level1  s2  WIP
    # 0 1   1   1   1   1
    

    【讨论】:

      【解决方案2】:

      您可以使用applyre.sub(),如下所示:

      df = pd.DataFrame([['Jan.10','ABC','East[3]','Normal[1]','TBD[WIP]']], columns=['date','customer','region[level1]','priority[s2]','planning[WIP]'])
      
      df.rename(columns=(lambda x : re.sub(r'(.*\[)|(\].*)', "", x)))
      

      输出:

          date    customer    level1    s2            WIP
      0   Jan.10  ABC         East[3]   Normal[1]   TBD[WIP]
      

      【讨论】:

        【解决方案3】:

        几点说明:

        • re.match 仅在字符串开头搜索匹配项,使用 re.search 在字符串中的任何位置查找匹配项
        • [^[]*\[([^]]*)\] 匹配除[ 之外的零个或多个字符,然后匹配[,除] 之外的零个或多个字符,然后匹配]it looks good,但它是您应该与@987654330 一起使用的模式@(见下文)。
        • 您收到'NoneType' object has no attribute 'groups' 问题,因为某些标头与您的模式不匹配(请参阅上面的正则表达式演示。)

        你可以使用

        import pandas as pd
        df = pd.DataFrame([['Jan.10','ABC','East[3]','Normal[1]','TBD[WIP]']], columns=['date','customer','region[level1]','priority[s2]','planning[WIP]'])
        df.columns = df.columns.str.replace(r'.*\[([^][]*)].*', r'\1', regex=True)
        
        >>> df
             date customer   level1         s2       WIP
        0  Jan.10      ABC  East[3]  Normal[1]  TBD[WIP]
        

        .*\[([^][]*)].* 正则表达式匹配

        • .* - 除换行符以外的任何零个或多个字符尽可能多
        • \[ - 一个 [ 字符
        • ([^][]*) - 第 1 组:除 [] 之外的任何零个或多个字符
        • ].* - ] char 和该行的其余部分。

        请参阅regex demo

        【讨论】:

          猜你喜欢
          • 2020-12-07
          • 2014-12-17
          • 2021-11-04
          • 2018-05-13
          • 2021-05-09
          • 2021-08-27
          • 1970-01-01
          • 1970-01-01
          • 2020-11-29
          相关资源
          最近更新 更多