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

时间:2020-06-08 08:35:38

标签: python pandas dictionary replace

嗨,我有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

我想要这样的结果df:

        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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我们首先可以更改$ {hQOpelText.r*.val}中所有类型为df2的列值,以遵守Variabledf1列中使用的值的约定,即{{1 }},那么我们可以从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'])
    )
)