无法替换另一列上的现有列基础

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)