我有一个NxN DataFrame,其值需要缩放到表示重要性的值范围,其中0表示无关紧要,3表示非常重要。
当然,用于缩放的公式I取决于每列中的最小值和最大值,每列的不同之处:Col A的范围可以是1-12而Col B&#39 ; s范围可以是1M到45M。
这是我使用的公式。
min_importance + ((max_importance - min_importance) / (max_spec_value - min_spec_value)) * (spec_value - min_spec_value)
如何为每列创建一个具有缩放值的新DataFrame或字典,同时保留索引,以后需要进行识别?
我尝试使用上面的公式创建一个函数,并使用apply()为每一行调用函数,但是我不能将列min / max传递给函数,因此不起作用
DataFrame示例("正文:零售价"和"正文:传感器分辨率"是列):
Body: retail price Body: sensor resolution Body name Nikon D500 2000.00 20668416 Nikon D7000 1200.00 16084992 Sony Alpha 7R II 3199.00 42177408 Canon EOS 5D Mark III 3499.00 22118400 Canon 7D Mark II 1799.00 19961856 iPhone 6 (front) 699.00 1000000 iPhone 6 (rear) 699.00 7990272 Fujifilm X-T1 1299.95 15980544 Fujifilm X-T2 1599.00 24000000
答案 0 :(得分:1)
min-max标准化可以通过以下方式完成:
(df - df.min()) / (df.max() - df.min())
Out:
Body: retail price Body: sensor resolution
Body name
Nikon D500 0.464643 0.477651
Nikon D7000 0.178929 0.366341
Sony Alpha 7R II 0.892857 1.000000
Canon EOS 5D Mark III 1.000000 0.512864
Canon 7D Mark II 0.392857 0.460492
iPhone 6 (front) 0.000000 0.000000
iPhone 6 (rear) 0.000000 0.169760
Fujifilm X-T1 0.214625 0.363805
Fujifilm X-T2 0.321429 0.558559
您不需要申请。 df.min()
将返回一个系列,当执行df - df.min()
pandas时,将从每个值中减去相应列的最小值。这称为广播,使任务更容易。
如果每列的重要性级别不同,最好的办法是将其存储在数据框中:
importances = pd.DataFrame({'max_imp': [1, 3], 'min_imp': [0, 0]}, index= df.columns)
importances
Out:
max_imp min_imp
Body: retail price 1 0
Body: sensor resolution 3 0
现在使用相同的原则,您可以调整公式:
importances['min_imp'] + ((importances['max_imp'] - importances['min_imp']) / (df.max() - df.min())) * (df - df.min())
Out:
Body: retail price Body: sensor resolution
Body name
Nikon D500 0.464643 1.432952
Nikon D7000 0.178929 1.099024
Sony Alpha 7R II 0.892857 3.000000
Canon EOS 5D Mark III 1.000000 1.538591
Canon 7D Mark II 0.392857 1.381475
iPhone 6 (front) 0.000000 0.000000
iPhone 6 (rear) 0.000000 0.509280
Fujifilm X-T1 0.214625 1.091415
Fujifilm X-T2 0.321429 1.675676
请注意,importances
的索引和实际数据框的列应匹配。在此示例中,第一列的范围转换为[0-1],第二列的范围转换为[0-3]。