如何在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
,但我想不出来。
我有一个完整的数据输出 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
,但我想不出来。