數據清洗

前面我們簡單的介紹了數據採集,現在假設我們有了數據了,那是不是就可以直接做數據分析了呢?彆着急,我們採集得到的數據往往沒有那麼完美,還需要一個特別關鍵的步驟,那就是數據清洗。
先說一下數據清洗的幾條規則:
1.完整性: 對於現有的數據,我們需要判斷單條數據的完整性,需要統計的字段是否完善。
2.全面性: 觀察某一列的全部數值,比如在Excel表中,我們選中一列,可以看到該列的平均值、最大值、最小值。我們可以通過常識來判斷該列是否有問題,比如:數據定義、單位標識、數值本身。
3.合法性: 數據的類型、內容、大小的合法性。比如性別存在未知,年齡查過150等
4.唯一性: 數據是否存在重複記錄,因爲數據通常來自不同渠道的彙總,重複的情況是常見的。行數據、列數據都需要是唯一的,比如一個人不能重複記錄多次。

使用我們前面介紹的pandas庫來進行數據清洗:

問題1 缺失值

在我們採集到的數據中,有時因爲數據沒採集到,就會造成數據的缺失,一般對於這種情況,我們有以下三種方法可以解決:
1.直接刪除,刪除掉數據缺失的記錄。
2.採用均值,使用當前列的平均值。
3.採用高頻,使用當前列出現頻率最高的數據。
示例:
假如小明那一行有數據缺失,我們直接刪除:

import pandas
from pandas import Series,DataFrame
df=DataFrame(pandas.read_excel("test.xlsx"))

df = df.drop(index=['小明'])

對df[‘Age’]中缺失的數值用平均年齡進行填充,可以這樣寫:

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

如果我們用最高頻的數據進行填充,可以先通過value_counts()方法獲取Age字段最高頻次age_maxf,然後再對Age字段中缺失的數據用age_maxf進行填充:

age_maxf = df['Age'].value_counts().index[0]
df['Age'].fillna(age_maxf, inplace=True)
問題2 空行

如果我們發現出現空行,除了index之外,全部的值都是NaN。pandas的read_csv()並沒有可選的參數來忽略空行,這樣,我們就需要數據在被讀入之後再使用dropna()進行處理來刪除空行:

# 刪除全空的行
df.dropna(how='all',inplace=True) 
問題3 列數據的單位不統一

假設現在我們有一個weight列的數據,然後現在weight列的單位是不統一的,有的是千克(kgs),有的是磅(lbs)。現在我們想要以千克作爲統一的度量單位, 所以要將磅(lbs)轉爲千克:

# 獲取 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)
問題4 非ASCII字符

如果我們的數據集中出現非ascii的字符,我們可以採取刪除或者替換的方式來解決這個問題,選擇刪除:

# 刪除非 ASCII 字符
df['first_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
df['last_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
問題5 一列有多個參數

假設我們現在的數據集中有一列name中有多個字段的數據,比如有first_name和last_name同在一列中,我們現在想把他們分離出來兩列,並把原來的那一列name刪掉:

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

我們校驗一下數據中是否存在重複記錄。如果存在重複記錄,就使用pandas提供的drop_duplicates()方法來刪除重複數據:

# 刪除重複數據行
df.drop_duplicates(['first_name','last_name'],inplace=True)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章