在數據預處理過程中,空值的處理主要有以下三種處理方式:
- 刪除記錄:當原始數據量大,空值數據所佔比例較小,對結果影響不大時,可以對其進行丟棄處理。
- 插值:當原始數量較少,直接刪除空值會造成樣本量不足,可能會改變變量的原有分佈。此時,可以利用現有變量的信息,對空值進行填補。
- 不處理
Note:有時對於異常值,也會先將其置爲空值,然後根據情況使用以下方法處理。
可以使用多種處理方法:
-
data.describe( ):刪除記錄
describe() 函數可以查看數據的基本情況,包括:count 非空值數、mean 平均值、std 標準差、max 最大值、min 最小值、(25%、50%、75%)分位數等。
len(data) 是數據的記錄數
STEP1:統計數據中空值的記錄數爲:
explore=data.describe().T #轉置後方便查閱
explore['null']=len(data)-explore['count'] #空值的記錄數=總記錄數-非空值記錄數
得到了數據中空值的記錄數,則可以估量選用哪種處理方式。
STEP2:丟棄空值記錄,並存儲結果
(1)、丟棄屬性 sum_yr_1 且 sum_yr_2 爲 空 的記錄(==保留sum_yr 不爲空的記錄)
(2)、丟棄屬性 sum_yr 爲 0 的、avg_discount 不爲0、seg_km_sum 爲0的記錄(==保留 sum_yr 非0的,或者 avg_discount 與 seg_km_sum 同時爲0的記錄)
data = data[ data['SUM_YR_1'].notnull()*data['SUM_YR_2'].notnull() ] #保留非空值
secdata1 = data['SUM_YR_1']!=0
secdata2 = data['SUM_YR_2']!=0
secdata3 = (data['SEG_KM_SUM']==0) & (data['avg_discount']==0) #與
data = data[ secdata1 | secdata2 | secdata3 ] #或
-
Hive:刪除記錄
STEP1:統計數據中某幾個字段的空值記錄數(HiveQL)
use mysql /*聲明要使用的數據庫*/
create table t_null_count as
select * from
(select count(*) as sum_yr_null_count from air_data_base where sum_yr is null)
sum_yr_null_count,
(select count(*) as avg_kr_null_count from air_data_base where avg_kr is null)
avg_kr_null_count;
表 t_null_count 中是各個屬性的空值記錄數,根據記錄數分析要選用哪種方式處理空值。
STEP2:丟棄空值記錄,並存儲結果
(1)、丟棄屬性 sum_yr 爲 空 的記錄,將結果存儲在 t_sumyr_notnull 表
create table t_sumyr_notnull as
select * from air_data_base where sum_yr is not null;
(2)、丟棄屬性 avg_kr 爲 0 的記錄,將結果存儲在 t_avgkr_not_0 表
create table t_avgkr_not_0 as
select * from t_sumyr_notnull where avg_kr<>0;
-
Scipy:插值
拉格朗日法進行插值:
import pandas as pd
from scipy.interpolate import lagrange #導入拉格朗日插值函數
inputfile='inputsale.csv'
outputfile='sales.xls'
data=pd.read_csv(inputfile)
#自定義列向量插值函數
def ployinterp_column(s,n,k=5): # s 列向量,n 被插值的位置,k 取前後的數據個數
y=s[list(range(n-k,n) + list(range(n+1,n+1+k))] #使用缺失值前後各5個未缺失的數據參與建模
y=y[y.notnull()] #剔除空值
return lagrange(y.index, list(y))(n) #插值並返回插值結果
#逐個元素判斷是否需要插值
for i in data.columns:
for j in range(len(data)):
if(data[i].isnull())[j]: 如果爲空,那麼進行插值
data[i][j] = ployinterp_column(data[i],j)
data.to_excel(outputfile)