使用regex替换DataFrame中的列

2024-06-07 13:07:10 发布

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

我有一个有4列的数据帧,col4是一个包含文本和数字的字符串:

 Col1           Col2              Col3           Col4
Syslog        2016,09,17           1    PD380_003 %LINK-3-UPDOWN
Syslog        2016,09,17           1    NM380_005 %BGP-5-NBR_RESET
Syslog        2016,09,14           1    NM380_005 %BGP-5-NBR_RESET
Syslog        2016,09,08           1    DO NOT TICKET LO380_004 %SYS-5-CONFIG_I Config

我需要保留该列的一个子字符串并删除任何其他内容,因此我使用了regex并创建了一个模式,但当我运行以下查询时,结果不是我想要的,它会用模式本身替换所有内容:

^{pr2}$

期望的结果是:

 Col1           Col2              Col3           Col4
Syslog        2016,09,17           1           PD380_003
Syslog        2016,09,17           1           NM380_005
Syslog        2016,09,14           1           LO380_004
Syslog        2016,09,08           1           LO380_004

但我得到的结果是:

 Col1           Col2              Col3           Col4
Syslog        2016,09,17           1    ([A-Z]{2}[0-9]{3}_[0-9]{3})
Syslog        2016,09,17           1    ([A-Z]{2}[0-9]{3}_[0-9]{3})
Syslog        2016,09,14           1    ([A-Z]{2}[0-9]{3}_[0-9]{3})
Syslog        2016,09,08           1    ([A-Z]{2}[0-9]{3}_[0-9]{3})

我做错什么了?在


Tags: 数据字符串内容模式col2col3col1bgp
3条回答

我想你需要^{}

data.Col4 = data.Col4.str.extract('([A-Z]{2}[0-9]{3}_[0-9]{3})', expand=False)

print (data)
     Col1        Col2  Col3       Col4
0  Syslog  2016,09,17     1  PD380_003
1  Syslog  2016,09,17     1  NM380_005
2  Syslog  2016,09,14     1  NM380_005
3  Syslog  2016,09,08     1  LO380_004

首先,你把错误的正则表达式放在了错误的位置。.replaceto_replace参数需要匹配要替换的内容和要删除的内容。因此,在本例中,您需要在regex前面加一个^.*,后面加一个.*$,因为您希望在匹配之外修剪字符串:

^.*([A-Z]{2}[0-9]{3}_[0-9]{3}).*$

Demo

其次,replace参数(如果是regex)需要是捕获组或固定字符串。在这种情况下,\1就可以了。在

最后,.replace的系列形式有一个更简单的语法(至少对我来说)要理解。在

鉴于:

^{pr2}$

您可以:

>>> df['Col4'].replace(to_replace='^.*([A-Z]{2}[0-9]{3}_[0-9]{3}).*$', value=r'\1', regex=True) 
0    PD380_003
1    NM380_005
2    NM380_005
3    LO380_004
Name: Col4, dtype: object

如果更简单,也可以使用位置参数版本:

df['Col4'].replace('^.*([A-Z]{2}[0-9]{3}_[0-9]{3}).*$', r'\1', regex=True)

但是您需要使用regex=True,因为替换字符串将被解释为regex而不仅仅是静态字符串。在

最后,直接分配到原始文件中:

>>> df['Col4']=df['Col4'].replace('^.*([A-Z]{2}[0-9]{3}_[0-9]{3}).*$', r'\1', regex=True)
>>> df
     Col1        Col2  Col3       Col4
0  SysLog  2016,09,17     1  PD380_003
1  SysLog  2016,09,17     1  NM380_005
2  SysLog  2016,09,17     1  NM380_005
3  SysLog  2016,09,17     1  LO380_004

你使用正则表达式的方式不对。在

{'Col4':{'.*':'([A-Z]{2}[0-9]{3}_[0-9]{3})'}}-表示将Col4列中的任意字符串替换为'([A-Z]{2}[0-9]{3}_[0-9]{3})'

试试这个:

In [87]: df.replace({'Col4':{r'.*?([A-Z]{2}[0-9]{3}_[0-9]{3}).*':r'\1'}}, regex=True)
Out[87]:
     Col1        Col2  Col3       Col4
0  Syslog  2016,09,17     1  PD380_003
1  Syslog  2016,09,17     1  NM380_005
2  Syslog  2016,09,14     1  NM380_005
3  Syslog  2016,09,08     1  LO380_004

相关问题 更多 >

    热门问题