如何使用df_A的最大最小值对df_B归一化?

现有两张表 df_Adf_B

>>>df_A = pd.DataFrame({'a':[1, 2], 'b':[3, 4]})
>>>df_A
   a  b
0  1  3
1  2  4
>>>df_B = pd.DataFrame({'c':[0, 1], 'd':[7, 8]})
>>>df_B
   c  d
0  0  7
1  1  8

需要对 df_B 的每一列进行归一化,但是是使用 df_A 的最大值和最小值,归一化公式为

\frac{x_B - min(x_A) }{ max(x_A) - min(x_A)}

也就是最终归一化的结果是

>>>normalize(df_B)
     c  d
0 -0.5  4
1  0.0  5

下面只讨论一般的情况,并且默认 df_Adf_B 对应位置的列是一一对应的。

  1. 构造 df_A 列名到每列最值的映射。
  2. 构造 df_A 列名到 df_B 列名的映射。
  3. apply 传入的函数中根据传入的 df_B 中列名和前面两个字典取出最值,处理后返回结果。
df_A = pd.DataFrame(np.random.rand(10,3),
                    columns=['A_col%d'%i for i in range(3)])
df_B = pd.DataFrame(np.random.rand(10,3),
                    columns=['B_col%d'%i for i in range(3)])
res = df_A.apply(lambda x:(x.max(), x.min()))
dict1 = dict(zip(df_A.columns,res.T.values))
dict2 = dict(zip(df_B.columns, df_A.columns))
def change(s):
    max_v, min_v = dict1[dict2[s.name]]
    ans = (s - min_v) / (max_v - min_v)
    return ans
df_B.apply(change)

也可以用sklearn中的归一化:

  • 对A做fit
  • 然后对B做transform
1赞

谢谢各位大佬的解答