[英]Pandas DataFrame: Compute values based on column min/max
我有一個NxN DataFrame,其值需要縮放到表示重要性的值范圍,其中0是不相關的,而3是非常重要的。
當然,我使用的公式取決於每列的最小值和最大值,每列的最小值和最大值不同:Col A的范圍可能是1-12,而Col B的范圍可能是1M至45M。
這是我正在使用的公式。
min_importance + ((max_importance - min_importance) / (max_spec_value - min_spec_value)) * (spec_value - min_spec_value)
如何在保留索引的同時創建每列具有縮放值的新DataFrame或字典,以后需要進行標識?
我嘗試使用上述公式創建一個函數,並使用apply()為每一行調用該函數,但是我無法將列的最小值/最大值傳遞給該函數,因此無法正常工作。
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
最小-最大歸一化可以使用:
(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()
熊貓將從每個值中減去相應列的最小值。 這稱為廣播,這使任務變得更容易。
如果每列的重要性級別不同,則最好的做法是將其存儲在數據框中:
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]。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.