2016-10-10 10 views
2

を使用してデータフレームの列を置き換え、COL4はテキストや数字などの文字列です:私は4列のデータフレームを持つ正規表現

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 

私は、その列の部分文字列を保持し、何かを削除する必要があります私は正規表現を使用し、私は、パターンを作ったが、私は次のクエリの結果は、私が欲しいものではありませんを実行すると、それはパターン自体にすべてを置き換える:

data.replace({'Col4':{'.*':'([A-Z]{2}[0-9]{3}_[0-9]{3})'}},regex=True) 

所望の結果は次のとおりです。

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}) 

+0

あなたが交換__before__あなた 'data' DFを投稿することができますか? – MaxU

+0

はいもう一度それを確認してください。 – faranak777

答えて

1

まず、あなたは間違った位置に正規表現の間違ったを持っています。 .replaceへのto_replaceの引数は、置き換えるものと削除するものと一致する必要があります。あなたは試合外の文字列をトリミングしたいので、だから、この場合には、あなたの正規表現の後ろの前で^.*.*$が必要です

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

Demo

第二に、replace引数、正規表現であれば、キャプチャグループまたは固定ストリングである必要があります。この場合は\1となります。

最後に、.replaceのシリーズフォームは、わかりやすい構文(少なくとも私にとって)を理解することができます。

だから、与えられた:あなたが行うことができます

>>> df 
    Col1  Col2 Col3           Col4 
0 SysLog 2016,09,17  1      PD380_003 %LINK-3-UPDOWN 
1 SysLog 2016,09,17  1      NM380_005 %BGP-5-NBR_RESET 
2 SysLog 2016,09,17  1      NM380_005 %BGP-5-NBR_RESET 
3 SysLog 2016,09,17  1 DO NOT TICKET LO380_004 %SYS-5-CONFIG_I Config 

>>> 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以降が必要です置換文字列は静的文字列だけでなく、正規表現として解釈されます。

最後に、元に直接割り当てる:

>>> 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 
+0

説明してくれてありがとう私はパンダの新人です。 – faranak777

2

私はあなたがextractが必要だと思う:

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 
+0

はいそれは動作しますが、私はちょうど置き換えが正規表現を読むことができないのだろうかと思っていますか? – faranak777

+0

うーん、私は[docs](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.replace.html)をチェックすると動作します。 – jezrael

+0

しかし、私はバグだと思う。 – jezrael

0

あなたは間違った方法で正規表現を使用していました。

{'Col4':{'.*':'([A-Z]{2}[0-9]{3}_[0-9]{3})'}}は - 手段がこれを試してみてください'([A-Z]{2}[0-9]{3}_[0-9]{3})'

Col4欄に何文字列を置換:

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 
関連する問題