如何使用正则表达式重命名Pandas数据帧的列?

2024-04-29 05:51:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dataframe,它的列名如下所示,其中一些列名的子字符串在[]

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

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

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

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

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]


Tags: columns字符串nameinredataframedffor
3条回答

您可以像下面这样使用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]

几点注意:

  • re.match仅在字符串开头搜索匹配项,使用re.search在字符串中的任何位置查找匹配项
  • [^[]*\[([^]]*)\]匹配除[之外的零个或多个字符,然后是[,除]之外的零个或多个字符,然后是]it looks good,但这是一种应该与.str.replace一起使用的模式(见下文)
  • 您会遇到'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]

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

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

regex demo

你可以试试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

相关问题 更多 >