2014-02-13 68 views
12

我有一個熊貓數據框'df',我想在其中逐列執行一些縮放。按大小逐列縮放數字[python]

  • 在'a'列中,我需要最大數爲1,最小數爲0,所有其他數據將相應地擴展。
  • 然而,在'b'列中,我需要的最小數量爲1的最大數量爲0,並且所有其他要相應地擴展。

是否有Pandas函數來執行這兩個操作?如果不是,numpy肯定會。

a b 
A 14 103 
B 90 107 
C 90 110 
D 96 114 
E 91 114 

謝謝!

+1

嗯,我想我需要在列b上的一些幫助:如何可以1是列中的最小數字,其中有0,以及如何可以0是列中的最大數字, 1? – logc

回答

15

你可以減去min,然後除以最大值(小心0/0)。

In [11]: df 
Out[11]: 
    a b 
A 14 103 
B 90 107 
C 90 110 
D 96 114 
E 91 114 

In [12]: df -= df.min() # equivalent to df = df - df.min() 

In [13]: df /= df.max() # equivalent to df = df/df.max() 

In [14]: df 
Out[14]: 
      a   b 
A 0.000000 0.000000 
B 0.926829 0.363636 
C 0.926829 0.636364 
D 1.000000 1.000000 
E 0.939024 1.000000 

要將列的順序切換(從1到0,而不是0到1):

In [15]: df['b'] = 1 - df['b'] 

的另一種方法,是否定B柱第一df['b'] = -df['b']) 。

+0

雖然你需要爲'b'選擇'1-'。 – DSM

+0

你需要弄亂'b'列才能讓事情翻轉。我會說乘以-1,應用sub和div,然後再乘以-1。 – TomAugspurger

+0

或帝斯曼的方式。更容易:) – TomAugspurger

3

這是不是很優雅,但此兩個欄情況下,下面的工作:

#Create dataframe 
df = pd.DataFrame({'A':[14,90,90,96,91], 'B':[103,107,110,114,114]}) 

#Apply operates on each row or column with the lambda function 
#axis = 0 -> act on columns, axis = 1 act on rows 
#x is a variable for the whole row or column 
#This line will scale minimum = 0 and maximum = 1 for each column 
df2 = df.apply(lambda x:(x.astype(float) - min(x))/(max(x)-min(x)), axis = 0) 

#Want to now invert the order on column 'B' 
#Use apply function again, reverse numbers in column, select column 'B' only and 
#reassign to column 'B' of original dataframe 
df2['B'] = df2.apply(lambda x: 1-x, axis = 1)['B'] 

如果我找到一個更優雅的方式(例如,使用列索引:(0或1)模2 - 1選擇應用操作中的符號,這樣只需一個應用命令就可以完成,我會讓你知道的。

26

這就是你如何使用sklearnpreprocessing模塊來完成它。具有許多用於縮放和對中數據的預處理功能。

In [0]: from sklearn.preprocessing import MinMaxScaler 

In [1]: df = pd.DataFrame({'A':[14,90,90,96,91], 
          'B':[103,107,110,114,114]}).astype(float) 

In [2]: df 
Out[2]: 
    A B 
0 14 103 
1 90 107 
2 90 110 
3 96 114 
4 91 114 

In [3]: scaler = MinMaxScaler() 

In [4]: df_scaled = pd.DataFrame(scaler.fit_transform(df), columns=df.columns) 

In [5]: df_scaled 
Out[5]: 
      A   B 
0 0.000000 0.000000 
1 0.926829 0.363636 
2 0.926829 0.636364 
3 1.000000 1.000000 
4 0.939024 1.000000