Pandas DataFrame:基于列min / max计算值

时间:2016-08-18 22:07:59

标签: python dataframe

我有一个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

1 个答案:

答案 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]。