2015-10-02 45 views
2

我正在處理包含名爲「raw_parameter_name」的列的數據框。在這一列中,我有不同的字符串值。幾個值類似於以下模式「ABCD; MEAN」。 我想要做的是用「ABCD; X-BAR」替換每個值「ABCD; MEAN」。子字符串「ABCD」可能會有所不同,但模式「MEAN」是我想要替換的常量。使用「替換」方法查看不同的選項,但不知道如何替換子字符串而不是整個字符串。請指教。 預先感謝您替換熊貓數據框中的子字段列

回答

2

您可以使用正則表達式模塊re例如:

import pandas as pd 
import re 

df = pd.DataFrame({"row_parameter_name":['abcd;MEAN','Dogg11;MEAN',';MEAN']}) 

Out[126]: 
    row_parameter_name 
0   abcd;MEAN 
1  Dogg11;MEAN 
2    ;MEAN 

df['row_parameter_name'] = df['row_parameter_name'].apply(lambda x: re.sub(';MEAN$',';X-BAR',x)) 

In [128]: df 
Out[128]: 
    row_parameter_name 
0   abcd;X-BAR 
1  Dogg11;X-BAR 
2    ;X-BAR 
+0

謝謝了很多。這對我有用。欣賞快速響應 – Felix

+0

沒問題,如果對你來說可以的話,你可以upvote /接受它! –

2

使用str.contains創建一個布爾指數掩蓋系列,然後str.replace更換您的字符串:

In [172]: 
df = pd.DataFrame({'raw_parameter_name':['ABCD;MEAN', 'EFGH;MEAN', '1234;MEAN', 'sdasd;MEAT']}) 
df 

Out[172]: 
    raw_parameter_name 
0   ABCD;MEAN 
1   EFGH;MEAN 
2   1234;MEAN 
3   sdasd;MEAT 

In [173]: 
df.loc[df['raw_parameter_name'].str.contains(';MEAN$'), 'raw_parameter_name'] = df['raw_parameter_name'].str.replace('MEAN', 'X-BAR') 
df 

Out[173]: 
    raw_parameter_name 
0   ABCD;X-BAR 
1   EFGH;X-BAR 
2   1234;X-BAR 
3   sdasd;MEAT 

這符合其中substrin ';MEAN'存在$是一個終止符

布爾面具看起來如下:

In [176]: 
df['raw_parameter_name'].str.contains(';MEAN$') 

Out[176]: 
0  True 
1  True 
2  True 
3 False 
Name: raw_parameter_name, dtype: bool 

時序

對於40,0000行DF使用str.replace比使用apply快:

In [183]: 
import re 
%timeit df['raw_parameter_name'].apply(lambda x: re.sub(';MEAN$',';X-BAR',x)) 
%timeit df['raw_parameter_name'].str.replace('MEAN', 'X-BAR') 
​ 
1 loops, best of 3: 1.01 s per loop 
1 loops, best of 3: 687 ms per loop