【问题标题】:How to replace value in whole dataframe based on dictionary when part of string match?当部分字符串匹配时,如何根据字典替换整个数据框中的值?
【发布时间】:2020-09-27 04:25:38
【问题描述】:

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

第二个数据框是这样的:

        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

【问题讨论】:

  • 这能回答你的问题吗? Remap values in pandas column with a dict
  • 不,因为我不能直接映射值,因为我有不同的值。如果我创建字典,那么与第二个数据帧相比,它将具有不同的值。
  • 您可以将$ {hQOpelText.r1.val} 转换为hQOpelTextr1,如果它们要保持一致,然后再转换为dict。

标签: python pandas dictionary replace


【解决方案1】:

我们可以首先更改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

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

    • 一如既往地感谢您的回答 :) 你能区分你在任何地方使用的数据帧吗df 所以我不确定你在哪里使用什么?
    • @s_khan92 - 不确定是否理解,但似乎只有在处理不同的DataFrames 并需要区分它们时才使用df1, df2, df3 而不是df
    猜你喜欢
    • 1970-01-01
    • 2019-10-08
    • 2020-09-23
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多