2017-07-25 9 views
3

私は一連の文字列を持っています。私はこのようなことをしたい:条件に基づいてpandasシリーズの値を更新します。

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

基本的には、 '!'文字列の中の '!'の前の部分に置き換えてください。このコードは、シリーズをまったく変更していないようです。条件付き置換を正しく行うには?

答えて

5

私は条件がindexing with strで使用str.split場合に必要ではないと思います。

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

の@ 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あなたはまた、regex=Trueパラメータでpd.Series.replaceを使用することができます

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