簡體   English   中英

如何在Python中使用NaN值規范化數據

[英]How to Normalize data with NaN values in python

我使用的數據有一些空值,我想使用knn插補來插補空值。 為了有效地估算,我想規范化數據。

normalizer = Normalizer() #from sklearn.preprocessing
normalizer.fit_transform(data[num_cols]) #columns with numeric value

錯誤:輸入包含NaN,無窮大或對於dtype('float64')而言太大的值。

那么我該如何規范具有NaN的數據

我建議不要在sklearn中使用normalize,因為它不處理NaN。 您可以簡單地使用以下代碼對數據進行規范化。

df['col']=(df['col']-df['col'].min())/(df['col'].max()-df['col'].min())

上面的方法在規范化數據時會忽略NaN

sklearn.preprocessing.Normalizer並非像現在其他答案一樣大約為0均值,1 stdev歸一化。 Normalizer()用於將行縮放為單位范數,例如以改善聚類或原始問題歸因。 您可以在這里這里閱讀有關差異的信息 為了擴展行,您可以嘗試如下操作:

import numpy as np

A = np.array([[  7,     4,   5,  7000],
              [  1,   900,   9,   nan],
              [  5, -1000, nan,   100],
              [nan,   nan,   3,  1000]])

#Compute NaN-norms
L1_norm = np.nansum(np.abs(A), axis=1)
L2_norm = np.sqrt(np.nansum(A**2, axis=1))
max_norm = np.nanmax(np.abs(A), axis=1)

#Normalize rows
A_L1 =  A / L1_norm[:,np.newaxis] # A.values if Dataframe
A_L2 =  A / L2_norm[:,np.newaxis]
A_max = A / max_norm[:,np.newaxis]

#Check that it worked
L1_norm_after = np.nansum(np.abs(A_L1), axis=1)
L2_norm_after = np.sqrt(np.nansum(A_L2**2, axis=1))
max_norm_after = np.nanmax(np.abs(A_max), axis=1)

 In[182]: L1_norm_after
Out[182]: array([1., 1., 1., 1.])

 In[183]: L2_norm_after
Out[183]: array([1., 1., 1., 1.])

 In[184]: max_norm_after
Out[184]: array([1., 1., 1., 1.])

如果Google(像我一樣)將您帶到這里,並且您想要使用estimator API將列標准化為0均值,1 stdev,則可以使用sklearn.preprocessing.StandardScaler 它可以處理NaN(在sklearn 0.20.2上測試,我記得它在某些舊版本上不起作用)。

from numpy import nan, nanmean
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

A = [[  7,     4,   5,  7000],
     [  1,   900,   9,   nan],
     [  5, -1000, nan,   100],
     [nan,   nan,   3,  1000]]

scaler.fit(A)

In [45]: scaler.mean_
Out[45]: array([4.33333333,  -32.,    5.66666667, 2700.])

In [46]: scaler.transform(A)
Out[46]: array([[ 1.06904497,  0.04638641, -0.26726124,  1.40399977],
                [-1.33630621,  1.20089267,  1.33630621,         nan],
                [ 0.26726124, -1.24727908,         nan, -0.84893009],
                [        nan,         nan, -1.06904497, -0.55506968]])

In [54]: nanmean(scaler.transform(A), axis=0)
Out[54]: array([ 1.48029737e-16,  0.00000000e+00, -1.48029737e-16,0.00000000e+00])

此方法將所有列歸一化為[0,1],並且NaN仍為NaN

def norm_to_zero_one(df):
    return (df - df.min()) * 1.0 / (df.max() - df.min())

例如:

[In]
df = pd.DataFrame({'A': [10, 20, np.nan, 30],
                   'B': [1, np.nan, 10, 5]})
df = df.apply(norm_to_zero_one)
[Out]
     A         B
0  0.0  0.000000
1  0.5       NaN
2  NaN  1.000000
3  1.0  0.444444

df.max()df.min()返回每列的最大值和最小值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM