无法替换另一列上的现有列基础
Unable to replace an existing column basis on another column
下面是两个数据框。数据帧 df1 是一个干净文件,必须用作另一个具有未清理信息的数据帧 df2 的映射文件。
df1=pd.DataFrame({'Make': {0: 'ASHOK LEYLAND', 1: 'ASTON MARTIN', 2: 'ASTON MARTIN'},
'Model': {0: 'STILE', 1: 'DB9', 2: 'RAPIDE'},
'Variant': {0: 'LE 7 STR', 1: 'VOLANTE', 2: 'LUXE'},
'Fuel': {0: 'DIESEL', 1: 'PETROL', 2: 'PETROL'}})
df2=pd.DataFrame({'Make': {0: 'ASHOK LEYLANDSTILELE 7 STR',
1: 'ASTON MARTINDB9VOLANTE',
2: 'ASTON MARTINRAPIDELUXE'},
'Model': {0: 'STILELE 7 STR', 1: 'DB9VOLANTE', 2: 'RAPIDELUXE'},
'Variant': {0: 'LE 7 STRSTILE', 1: 'VOLANTEDB9', 2: 'LUXERAPIDE'},
'Fuel': {0: 'Dieseel', 1: 'Dieseel', 2: 'PETROLjlljlj'}})
我使用下面的代码在 df1 的 'Make' 列的基础上清理了 df2 的 'Make' 列。但是我在我的新专栏 'Make_new' 上没有得到任何结果。下面是代码:
df2['Make_new'] = df2['Make'].apply(lambda v: [Make for Make in df1 if Make in ('ASHOK','ASTON')])
您可以使用正则表达式将一组给定的“允许”名称与有缺陷的值进行匹配,并仅提取匹配的部分。请注意,以下解决方案仅涵盖有缺陷的名称具有正确前缀的情况。
import re
def clean_col(correct_names_expression):
def clean_row_func(x):
if match_res := re.match(correct_names_expression, x): # if no match is asserted, then None is returned
return match_res[0]
else:
return None
return clean_row_func
func_to_correct_rows = clean_col('(' + '|'.join(df1.Make.tolist()) + ')')
df2.Make.apply(func_to_correct_rows )
Out:
0 ASHOK LEYLAND
1 ASTON MARTIN
2 ASTON MARTIN
我完全不明白您为什么需要 df1
。 “清理”逻辑非常简单。这样就可以了。
def clean(row):
if 'ASHOK' in row.Make:
return 'ASHOK LEYLAND'
if 'ASTON' in row.Make:
return 'ASTON MARTIN'
return row.Make
df2['cleaned'] = df2.apply(clean, axis=1)
下面是两个数据框。数据帧 df1 是一个干净文件,必须用作另一个具有未清理信息的数据帧 df2 的映射文件。
df1=pd.DataFrame({'Make': {0: 'ASHOK LEYLAND', 1: 'ASTON MARTIN', 2: 'ASTON MARTIN'},
'Model': {0: 'STILE', 1: 'DB9', 2: 'RAPIDE'},
'Variant': {0: 'LE 7 STR', 1: 'VOLANTE', 2: 'LUXE'},
'Fuel': {0: 'DIESEL', 1: 'PETROL', 2: 'PETROL'}})
df2=pd.DataFrame({'Make': {0: 'ASHOK LEYLANDSTILELE 7 STR',
1: 'ASTON MARTINDB9VOLANTE',
2: 'ASTON MARTINRAPIDELUXE'},
'Model': {0: 'STILELE 7 STR', 1: 'DB9VOLANTE', 2: 'RAPIDELUXE'},
'Variant': {0: 'LE 7 STRSTILE', 1: 'VOLANTEDB9', 2: 'LUXERAPIDE'},
'Fuel': {0: 'Dieseel', 1: 'Dieseel', 2: 'PETROLjlljlj'}})
我使用下面的代码在 df1 的 'Make' 列的基础上清理了 df2 的 'Make' 列。但是我在我的新专栏 'Make_new' 上没有得到任何结果。下面是代码:
df2['Make_new'] = df2['Make'].apply(lambda v: [Make for Make in df1 if Make in ('ASHOK','ASTON')])
您可以使用正则表达式将一组给定的“允许”名称与有缺陷的值进行匹配,并仅提取匹配的部分。请注意,以下解决方案仅涵盖有缺陷的名称具有正确前缀的情况。
import re
def clean_col(correct_names_expression):
def clean_row_func(x):
if match_res := re.match(correct_names_expression, x): # if no match is asserted, then None is returned
return match_res[0]
else:
return None
return clean_row_func
func_to_correct_rows = clean_col('(' + '|'.join(df1.Make.tolist()) + ')')
df2.Make.apply(func_to_correct_rows )
Out:
0 ASHOK LEYLAND
1 ASTON MARTIN
2 ASTON MARTIN
我完全不明白您为什么需要 df1
。 “清理”逻辑非常简单。这样就可以了。
def clean(row):
if 'ASHOK' in row.Make:
return 'ASHOK LEYLAND'
if 'ASTON' in row.Make:
return 'ASTON MARTIN'
return row.Make
df2['cleaned'] = df2.apply(clean, axis=1)