pandas - python - 使用两个词典映射一个pandas列

我有一个 df:


ColA ColB


1 1


2 3


2 2


1 2


1 3


2 1



我想使用两个不同的字典来更改ColB中的值。 如果ColA中的值为 1和 d2,则使用 d1,如果ColB中的值为 2,则为。


d1 = {1:'a',2:'b',3:'c'}


d2 = {1:'d',2:'e',3:'f'}



结果:


ColA ColB


1 a


2 f


2 e


1 b


1 c


2 d



怎样才能达到最好的效果?

时间:

一种方法是使用 np.where 使用一个字典或另一个字典根据 ColA的值来对 ColB 中的值进行 map:


import numpy as np


df['ColB'] = np.where(df.ColA.eq(1), df.ColB.map(d1), df.ColB.map(d2))



这给出了:


 ColA ColB


0 1 a


1 2 f


2 2 e


3 1 b


4 1 c


5 2 d



如果需要对多个组执行这个操作,则使用 dict的dict 来分别映射每个组。 理想情况下,你可以找到一些创建 d的功能方法:


d = {1: d1, 2: d2}


df['ColB'] = pd.concat([gp.ColB.map(d[idx]) for idx, gp in df.groupby('ColA')])



输出:


 ColA ColB


0 1 a


1 2 f


2 2 e


3 1 b


4 1 c


5 2 d



可以为一个元素创建一个函数,然后在dataframe中使用 lambda 。


def your_func(row):


 if row["ColA"] == 1:


 return d1[row["ColB"]]


 elif row["ColB"] == 2:


 return d2[row["ColB"]]


 else:


 return None



df["ColB"] = df.apply(lambda row: your_func(row), axis=1)



你可以使用两种替换方式:


df.loc[df['ColA'] == 1,'ColB'] = df['ColB'].replace(d1, regex=True)


df.loc[df['ColA'] == 2,'ColB'] = df['ColB'].replace(d2, regex=True)



我希望这对你有帮助

...