我在pandas数据框中有2个字段。我想用'var2'中的值删除'var1'中的字符串值,但前提是该值在'var1'中是独立的(不是在单词中)。例如,在var1 =“APPLE AP”中的字符串中,替换var2“AP”中的值,以使最终值为“APPLE”。当前代码导致返回值“PLE”:
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
仅供参考:lambda代码片段是一个包含数亿行的大型项目的一部分。
答案 0 :(得分: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