11 數據清洗

在數據分析過程中,數據清洗在時間上佔到了80%。

數據質量的準則(「完全合一」)

(1)完整性:單條數據是否存在空值,統計的字段是否完善。

(2)全面性:觀察某一列的全部數值,通過常識來判斷該列是否有問題。

(3)合法性:數據的類型、內容、大小的合法性。

(4)唯一性:數據是否存在重複記錄

數據清理要使數據標準、趕緊、連續,爲後續數據統計、數據挖掘做好準備。

1、完整性

問題1:缺失值

解決辦法:①刪除   ②均值   ③高頻

df['Age'].fillna(df['Age'].mean(), inplace=True)              #均值

age_maxf = train_features['Age'].value_counts().index[0]
train_features['Age'].fillna(age_maxf, inplace=True)          #高頻值

問題2:刪除空行

# 刪除全空的行(除了index外,其他都是空值)
df.dropna(how='all',inplace=True)

2.全面性

問題:列數據的單位不統一

# 獲取 weight 數據列中單位爲 lbs 的數據
rows_with_lbs = df['weight'].str.contains('lbs').fillna(False)
print df[rows_with_lbs]
# 將 lbs 轉換爲 kgs, 2.2lbs=1kgs
for i,lbs_row in df[rows_with_lbs].iterrows():
	# 截取從頭開始到倒數第三個字符之前,即去掉 lbs。
	weight = int(float(lbs_row['weight'][:-3])/2.2)
	df.at[i,'weight'] = '{}kgs'.format(weight)

3.合理性

問題:非ASCII字符

# 刪除非 ASCII 字符
df['first_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
df['last_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)

4.唯一性

問題1:一列有多個參數

# 切分名字,刪除源數據列
df[['first_name','last_name']] = df['name'].str.split(expand=True)
df.drop('name', axis=1, inplace=True)

問題2:重複數據

# 刪除重複數據行
df.drop_duplicates(['first_name','last_name'],inplace=True)