2017-12-12 14 views
0

私はパンダのデータフレーム内の2つのフィールドを持っているを使用して単独の文字列をスタンドに置き換えます。 'var1'の文字列値を 'var2'の値で削除したいのですが、その値が 'var1'のスタンドアローン(単語内ではない)である場合のみです。たとえば、var1 = "APPLE AP"の文字列では、最終値が "APPLE"になるようにvar2 "AP"の値を置き換えます。 「PLE」の戻り値で、現在のコードの結果:FYIPythonは入力

var1 = pd.Series(['APPLE AP','CO COMPANY CO','CO COMPANY CO','DR','CAT']) 

    var2 = pd.Series(['AP','CO','COMPANY','DR',' ']) 

    var1_expected_output = pd.Series(['APPLE','COMPANY','CO CO',' ','CAT']) 

    df = pd.DataFrame(dict(var1= var1,var2= var2 ,var1_expected_output=var1_expected_output)) 

    #correct this part: df['var1_incorrect_output'] = df.apply(lambda x: x['var1'].replace(x['var2'], ''), axis=1) 

    df = df[['var1','var2','var1_expected_output','var1_incorrect_output']] 

    print df 

    var1   var2  var1_expected_output var1_incorrect_output 
0 APPLE AP  AP  APPLE     PLE 
1 CO COMPANY CO CO  COMPANY    MPANY 
2 CO COMPANY CO COMPANY CO CO     CO CO 
3 DR DR  
4 CAT      CAT     CAT 

:コードのラムダスニペットは、数百万行の百と非常に大規模なプロジェクトの一部です。

+0

回答が役に立った場合は、[vote on and accept](https://stackoverflow.com/help/someone-answers)をクリックしてください。ありがとう。 –

答えて

0

オプション1
apply + re.sub - ゆっくり、しかし

import re 

df = pd.DataFrame({'var1' : var1, 'var2' : var2})   
df.apply(lambda x: re.sub(r'\b{}\b'.format(x.var2), '', x.var1), 1) 

0  APPLE 
1  COMPANY 
2  CO CO 
3    
4   CAT 
dtype: object 

オプション2
set差が動作することが保証 - (より高速にする必要がありますが、動作する保証はありませんので、セットは順序や重複を保たない)

(var1.str.split().apply(set) - var2.str.split().apply(set)).str.join(' ') 

0  APPLE 
1 COMPANY 
2   CO # fails here 
3   
4  CAT 
dtype: object