2017-07-25 76 views
3

我有一系列的字符串。我想做這樣的事情:基於條件更新熊貓系列值

for item in series: 
    if '!' in item: 
     series[item] = item.split('!')[0] 

基本上,如果有'!'在字符串中,將其替換爲'!'之前的部分。代碼似乎並沒有改變系列。如何正確地進行條件替換?

回答

5

我覺得條件不是必要的,如果使用str.splitindexing with str

s = pd.Series(['sss!dd','sdsd', 'aa!p']) 

s = s.str.split('!').str[0] 
0  sss 
1 sdsd 
2  aa 
dtype: object 

但如果需要條件添加maskstr.contains

s = s.mask(s.str.contains('!'), s.str.split('!').str[0]) 
print (s) 
0  sss 
1 sdsd 
2  aa 
dtype: object 
+0

我還需要剝去就地尾隨空間的他們。? – user2559578

+0

如有必要,使用's = s.str.strip()。str.split('!')。str [0]'。 – jezrael

4

使用set @ jezrael的數據:

In [74]: s 
Out[74]: 
0 sss!dd 
1  sdsd 
2  aa!p 
dtype: object 

In [75]: s = s.str.replace(r'\!.*','') 

In [76]: s 
Out[76]: 
0  sss 
1 sdsd 
2  aa 
dtype: object 
3

選項1
您還可以使用pd.Series.replaceregex=True參數

s.replace('(.*)!.*', r'\1', regex=True) 

0  sss 
1 sdsd 
2  aa 
dtype: object 

選項2
您可以使用numpy.core.defchararray.split

pd.Series(
    [x[0] for x in np.core.defchararray.split(s.values.astype(str), '!')], 
    s.index 
) 

0  sss 
1 sdsd 
2  aa 
dtype: object