數據分析——數據清洗之缺失值處理

在將數據進行分析或者跑機器學習算法時,缺失值處理是很重要的一步,下面將通過讀取csv文件來舉例說明。

讀取csv文件時常見的缺失值有如下類型。

  • 空數據
  • 0
  • NA
  • 其他表示形式,如‘null’

一、空數據和NA數據以及其他表示空的數據

創建一個測試文件,從中可以看出,空數據或者是NA數據都會被默認爲是NaN。並且在文件中只有是NA或者是空是纔會被轉換爲NaN,而如果是null、None之類的則會被當作字符串處理。

 

   ID   name  gender   age
0   1    NaN     NaN  20.0
1   2  Zhang    male  20.0
2   3   Wang  female   NaN
3   4    Liu    male  20.0
4   5    Sun    male  21.0

 既然都被轉換爲了NaN,那麼就可以通過pandas.fillna()來將Nan替換爲指定的值了。

df = pd.read_csv('./data/for_test.csv')
df['name'] = df['name'].fillna('WU')
df['age'] = df['age'].fillna(df['age'].mean())
df['gender'] = df['gender'].fillna('male')
print(df)
   ID   name  gender    age
0   1     WU    male  20.00
1   2  Zhang    male  20.00
2   3   Wang  female  20.25
3   4    Liu    male  20.00
4   5    Sun    male  21.00

如果是null或者None之類的表示空的字符串可以先通過replace函數來處理,將這些空都統一爲NaN。

df = df.replace('null', value=np.NaN)

二、如何在大規模數據中判斷缺失值

通過一中的分析可以知道,無論是空還是Na形式的數據在DataFrame中都會轉換爲NaN數據類型。

下面通過Kaggle中House Price中的數據來進行舉例說明如何在大規模數據中判斷缺失值。

df = pd.read_csv('./data/train.csv')
miss_data_total = df.isnull().sum().sort_values(ascending=False)
miss_data_per = (df.isnull().sum()/df.isnull().count()).sort_values(ascending=False)
miss_data = pd.concat([miss_data_total, miss_data_per], axis=1, keys=['Total', 'Percentage'])
print(miss_data.head(10))

首先,通過對總體數據進行isnull()判斷,然後進行降序處理方便查看。其中,df.isnull().sum()作用就是將df.isnull()返回的True or False數組按照行相加,得到的就是null的個數,而df.isnull().count()則是統計整個True or False 數組的大小,如果這裏用df.count()的話之會返回非null數據的個數統計。

             Total  Percentage
PoolQC         1453    0.995205
MiscFeature    1406    0.963014
Alley          1369    0.937671
Fence          1179    0.807534
FireplaceQu     690    0.472603
LotFrontage     259    0.177397
GarageCond       81    0.055479
GarageType       81    0.055479
GarageYrBlt      81    0.055479
GarageFinish     81    0.055479

其中缺失值大於15%的數據列我們就可以考慮將其直接刪掉了。

三、如何在大規模數據中處理缺失值

對於缺失值大於15%的數據我們可以直接刪除了。

這裏的df.drop()中的axis參數值有些讓人不好理解,因爲要刪除整個column,所以應該是按列刪除,所以axis應該是0,然而,這裏的axis對應的不是整個dataframe,而是對應columns這塊區域,將columns中的每個標籤按照水平方向刪除。

df = df.drop((miss_data[miss_data['Percentage'] > 0.15]).index, axis=1)

對於一些需要再考慮的數據列我們可以先打印出來,再進行選擇如何補全數據。

# check the missing data
def cat_exploration(df, column):
    print(df[column].value_counts())

# imput the missing data 
def cat_imputation(df, column, value):
    df.loc[df[column].isnull(), column] = value

還有些數據的缺失值通過實際情況判斷,結果比較明顯,那麼就可以直接填充。

df.loc[df['Id'] == 580, 'BsmtCond'] = 'TA'

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章