当部分字符串匹配时,如何基于字典替换整个数据帧中的值?

2024-09-23 08:19:26 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我有2个数据帧,其中我必须使用1个数据帧替换其他数据帧中的值。我通常可以创建字典来替换整个数据帧中的值,但其他数据帧中的值有点不同,所以我需要一个条件,在这个条件下,我可以判断字符串的部分是否匹配,然后它应该映射字典。 第一个数据帧如下所示:

enter image description here

第二个数据帧如下所示:

        id        cars1                     cars2

        1     $ {hQOpelText.r1.val}        BMW
        2     $ {hQOpelText.r2.val}        $ {hQOpelText.r2.val}
        3     $ {hQOpelText.r3.val}        $ {hQOpelText.r5.val}
        4     $ {hQOpelText.r4.val}        Audi
        5     $ {hQOpelText.r5.val}        Audi

我想这样做:

        id        cars1                     cars2

        1     Opel Adam                   BMW
        2     Opel Astra Estate           Opel Astra Estate
        3     Opel Astra Hatchback        Opel Grandland x 
        4     Opel Astra Saloon           Audi
        5     Opel Grandland x            Audi

Tags: 数据id字典val条件r2r5audi
2条回答

我们可以首先更改df2中类型$ {hQOpelText.r*.val}的所有列值,以遵守df1Variable列中使用的值的约定,即hQOpelTextr*,然后我们可以从df1中的相应值替换这些值:

cols = df2.select_dtypes(object).columns
df2[cols] = df2[cols].transform(
    lambda s: (
        s.str.replace(r'\$\s*\{([^\.]+).*?([^\.]+).*?\}', r'\g<1>\g<2>')
        .replace(df1.set_index('Variable')['AUS'])
    )
)

# print(df2)
   id                 cars1              cars2
0   1              OpehAdam                BMW
1   2     Opel Astra Estate  Opel Astra Estate
2   3  Opel Astra Hatchback   Opel Grandland X
3   4     Opel Astra Saloon               Audi
4   5      Opel Grandland X               Audi

想法是将.替换为空字符串,然后通过字典的键提取值,如果不匹配,映射并替换原始值:

c = df.select_dtypes(object).columns
func = lambda x: (x.str.replace('.', '', regex=False)
                  .str.extract(f'({"|".join(d.keys())})', expand=False)
                  .map(d)
                  .fillna(x))
df[c] = df[c].apply(func)

print (df)
   id                 cars1              cars2
0   1             Opel Adam                BMW
1   2     Opel Astra Estate  Opel Astra Estate
2   3  Opel Astra Hatchback    Opel Grandand X
3   4     Opel Astra Saloon               Audi
4   5       Opel Grandand X               Audi

相关问题 更多 >