如何在for循环中替换基于字典的值? [python]

How to replace values based on dictionary within for loop? [python]

我有一个完整的数据输出 csv,我想将其插入到回归模型中,当然包含一个因变量列和相关值,以及多个自变量列(参数)和那些相关值。问题是我的自变量值不是“真实”值,它们只是与实际值相对应的占位符。我正在使用 python 和 pandas 作为数据框。

我有这个数据框(参数为“Param”):

    Color Zone Dependent.var  Param_1  Param_2  Param_3
0    Blue    A            XX        0        1        3
1    Blue    A            XX        2        1        1
2    Blue    A            XX        0        0        1
3    Blue    B            XX        1        0        0
4    Blue    B            XX        2        2        2
5    Blue    B            XX        2        1        1
6    Blue    C            XX        2        0        0
7    Blue    C            XX        2        2        3
8    Blue    C            XX        3        1        1
9     Red    A            XX        3        2        1
10    Red    A            XX        0        1        3
11    Red    A            XX        3        3        2
12    Red    B            XX        2        1        1
13    Red    B            XX        0        1        3
14    Red    B            XX        1        0        0
15    Red    C            XX        0        2        1
16    Red    C            XX        1        1        0
17    Red    C            XX        3        2        3
18  Green    A            XX        2        2        3
19  Green    A            XX        0        1        3
20  Green    A            XX        3        2        2
21  Green    B            XX        2        1        1
22  Green    B            XX        0        2        3
23  Green    B            XX        2        3        2
24  Green    C            XX        0        1        1
25  Green    C            XX        3        1        0
26  Green    C            XX        3        2        3

抱歉这么长,但我觉得有必要传达数据结构。现在我有 9 个单独的字典(或键,我对这些术语感到困惑),每个颜色和区域组合 1 个,其中包含初始占位符值及其“真实”值的“翻译”,它们看起来像这样,其中每个 Color/Zone:

之间的“真实”值不同

对于蓝色(1 个用于 Blue/A,1 个用于 Blue/B,1 个用于 Blue/C):

          0   1   2   3
------------------------
Param_1   XX  XX  XX   XX
Param_2   XX  XX  XX   XX
Param_3   XX  XX  XX   XX 

对于红色(1 个用于 Red/A,1 个用于 Red/B,1 个用于 Red/C):

          0   1   2   3
------------------------
Param_1   YY  YY  YY   YY
Param_2   YY  YY  YY   YY 
Param_3   YY  YY  YY   YY

绿色(1 个用于 Green/A,1 个用于 Green/B,1 个用于 Green/C):

          0   1   2   3
------------------------
Param_1   ZZ  ZZ  ZZ  ZZ
Param_2   ZZ  ZZ  ZZ  ZZ 
Param_3   ZZ  ZZ  ZZ  ZZ

我想获取这些“参数值映射”,然后用它们替换初始数据框中的数字。在 python 中有没有一种简单的方法可以做到这一点?我只是对如何解决存在三种不同颜色和 3 个不同区域以及 9 组不同的替换值的问题感到非常困惑。我认为这将涉及一个 for 循环来遍历“颜色”和“区域”,但我不确定。

既然你没有给出具体的映射,我将使用这个示例映射:

PARAMS = ["Param_1", "Param_2", "Param_3"]

PARAM_MAP = {'Red': {'Param_1': {0: 'P1_R0', 1: 'P1_R1', 2: 'P1_R2', 3: 'P1_R3'},
                     'Param_2': {0: 'P2_R0', 1: 'P2_R1', 2: 'P2_R2', 3: 'P2_R3'},
                     'Param_3': {0: 'P3_R0', 1: 'P3_R1', 2: 'P3_R2', 3: 'P3_R3'}},
             'Green': {'Param_1': {0: 'P1_G0', 1: 'P1_G1', 2: 'P1_G2', 3: 'P1_G3'},
                       'Param_2': {0: 'P2_G0', 1: 'P2_G1', 2: 'P2_G2', 3: 'P2_G3'},
                       'Param_3': {0: 'P3_G0', 1: 'P3_G1', 2: 'P3_G2', 3: 'P3_G3'}},
             'Blue': {'Param_1': {0: 'P1_B0', 1: 'P1_B1', 2: 'P1_B2', 3: 'P1_B3'},
                      'Param_2': {0: 'P2_B0', 1: 'P2_B1', 2: 'P2_B2', 3: 'P2_B3'},
                      'Param_3': {0: 'P3_B0', 1: 'P3_B1', 2: 'P3_B2', 3: 'P3_B3'}}}

并使用我们将应用于数据框的这个函数:

def mapping(row):
    color_map = PARAM_MAP[row["Color"]]
    return pd.Series({p: color_map[p][v] for p, v in zip(PARAMS, row[PARAMS])})

现在应用映射并重新分配:

df[PARAMS] = df.apply(mapping, axis=1)

输出:

    Color Zone Dependent.var Param_1 Param_2 Param_3
0    Blue    A            XX   P1_B0   P2_B1   P3_B3
1    Blue    A            XX   P1_B2   P2_B1   P3_B1
2    Blue    A            XX   P1_B0   P2_B0   P3_B1
3    Blue    B            XX   P1_B1   P2_B0   P3_B0
4    Blue    B            XX   P1_B2   P2_B2   P3_B2
5    Blue    B            XX   P1_B2   P2_B1   P3_B1
6    Blue    C            XX   P1_B2   P2_B0   P3_B0
7    Blue    C            XX   P1_B2   P2_B2   P3_B3
8    Blue    C            XX   P1_B3   P2_B1   P3_B1
9     Red    A            XX   P1_R3   P2_R2   P3_R1
10    Red    A            XX   P1_R0   P2_R1   P3_R3
11    Red    A            XX   P1_R3   P2_R3   P3_R2
12    Red    B            XX   P1_R2   P2_R1   P3_R1
13    Red    B            XX   P1_R0   P2_R1   P3_R3
14    Red    B            XX   P1_R1   P2_R0   P3_R0
15    Red    C            XX   P1_R0   P2_R2   P3_R1
16    Red    C            XX   P1_R1   P2_R1   P3_R0
17    Red    C            XX   P1_R3   P2_R2   P3_R3
18  Green    A            XX   P1_G2   P2_G2   P3_G3
19  Green    A            XX   P1_G0   P2_G1   P3_G3
20  Green    A            XX   P1_G3   P2_G2   P3_G2
21  Green    B            XX   P1_G2   P2_G1   P3_G1
22  Green    B            XX   P1_G0   P2_G2   P3_G3
23  Green    B            XX   P1_G2   P2_G3   P3_G2
24  Green    C            XX   P1_G0   P2_G1   P3_G1
25  Green    C            XX   P1_G3   P2_G1   P3_G0
26  Green    C            XX   P1_G3   P2_G2   P3_G3

我想可能有更好的方法,也许是 groupby,但我想不出来。