嗨,我有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
我想要这样的结果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
答案 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
的列值,以遵守Variable
中df1
列中使用的值的约定,即{{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'])
)
)