資料分析實戰45筆記(11)資料清洗

2021-10-04 23:12:26 字數 4204 閱讀 7878

做完採集資料的工作後要進行的就是資料清洗工作。在資料探勘中,資料清洗就是這樣的前期準備工作。對於資料科學家來說,我們會遇到各種各樣的資料,在分析前,要投入大量的時間和精力把資料

以上資料要直接進行資料分析的話是不可行的。首先這些資料缺少標註。我們在收集整理資料的時候,一定要對資料做標註,資料表頭很重要。比如這份資料表,就缺少列名的標註,這樣一來我們就不知道每列資料所代表的含義,無法從業務中理解這些數值的作用,以及這些數值是否正確。

假設這是一家服裝店的統計資料,最上面的一行是列座標,最左側一列是行座標。列座標中,第0列代表的是序號,第1列代表的會員的姓名,第2列代表年齡,第3列代表體重,第4-6列代表男性會員的三圍尺寸,第7-9列代表女性會員的三圍尺寸。

有經驗的資料分析師都知道,好的資料分析師必定是一名資料清洗高手,要知道在整個資料分析過程中,不論是在時間還是功夫上,資料清洗大概都佔到了80%。

1.資料質量的準則

資料清洗規則總結為以下4個關鍵點,統一起來叫「完全合一」。

**1>**完整性:單挑資料是否存在空值,統計的字段是否完善。

**2>**全面性:觀察某一列的全部資料,比如在excel表中,選中一列來看該列的平均值、最大值、最小值。可以通過常識來判斷該列是否有問題,比如資料定義、單位標識、數值本身。

**3>**合法性:資料的型別、內容、大小的合法性。

**4>**唯一性:資料是否存在重覆記錄,因為資料通常來自不同渠道的彙總,重複的情況是常見的。行資料、列資料都需要是唯一的,比如乙個人不能重覆記錄多次,乙個人的體重也不能記錄多次。

2.清洗資料

資料清洗工具很多,以pandas工具為例。

1>完整性:

問題一:缺失值

在資料中有些年齡、體重數值是缺失的,這往往是因為資料量較大,在過程中,有些數值沒有採集到。通常我們可以採用以下三種方法:

•刪除:刪除資料缺失的記錄;

•均值:使用當前列的均值;

•高頻:使用當前列出現頻率最高的資料。

#比如對df['age']中缺失的數值用平均年齡進行填充

df['age'

].fillna(df[

'age'

].mean(

),inplace=

true

)#用最高頻的資料填充,可以先通過value_counts獲取age欄位最高頻次age_maxf,然後再對age欄位中缺失的資料用age_maxf進行填充

age_maxf=train_feature[

'age'

].value_counts(

).index[0]

train_features[

'age'

].fillna(age_maxf,inplace=

true

)

問題二:空行

我們發現資料中有乙個空行,除了 index 之外,全部的值都是 nan`

#pandas的read_csv()並沒有可選引數來忽略空行,這就需要在資料被讀入後再使用dropna()進行處理,刪除空行

df.dropna(how=

'all'

,inplace=

true

)

2>全面性

問題:列資料的單位不統一

觀察weight列的數值,我們能發現weight 列的單位不統一。有的單位是千克(kgs),有的單位是磅(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[row_with_lbs]

.iterrows():

#擷取從頭開始到倒數第三個字元之前,即去掉lbs

weight=

int(

float

(lbs_row[

'weight'][

:-3]

)/2.2)

df.at[i,

'weight']=

'{}kg'

.format

(weight)

3>.合理性

問題:非ascii字元

我們可以看到在資料集中 fristname 和 lastname 有一些非 ascii 的字元。

#採用刪除或者替換的方式來解決非ascii問題,這裡我們使用刪除方法

#刪除非ascii字元

df['first_name'

].replace(

,regex=

true

,inplace=

true

)df[

'last_name'

].replace(

, regex=

true

,inplace=

true

)

4>唯一性

問題一:一列有多個引數

在資料中不難發現,姓名列(name)包含了兩個引數firtname和lastname.為了達到資料整潔目的,我們將 name 列拆分成 firstname 和 lastname兩個字段。

#我們使用python的split方法,str.split(expand=true),將列表拆成新的列,再將原來的 name 列刪除。

#切分名字,刪除源資料列

df[[

'first_name'

,'last_name']]

=df[

'name'].

str.split(expand=

true

)df.drop(

'name'

,axis=

1,inplace=

true

)

問題二:重複資料

#校驗一下資料中是否存在重覆記錄。如果存在重覆記錄,就使用 pandas 提供的 drop_duplicates() 來刪除重複資料

練習:乙個美食資料

進行資料清洗

猜測這個資料可能是餐廳的採購資料,採購菜品所需要的食材

#1.完整性:ounces列中存在空值

#將空值替換為平均值

df['ounces'

].fillna(df[

'ounces'

].mean(

),inplace=

true

)#2.全面性:food列存在大小寫不一致問題,且有重複值

#將大小寫統一,但是重複的不能去掉

df['food'

]=df[

'food'].

str.lower(

)#3.合法性:ounces存在負值,不合實際,可能是輸入手誤

df['ounces'

]=df[

'ounces'].

(lambda x:

abs(x)

)#4.唯一性:雖然food列中存在重複值,但根據需求,有可能不能刪除重複值

#這裡列出刪除重複值的語句

df.drop_duplicates(

'food'

,inplace=

true

)

python kaggle資料分析實戰

三.資料處理 首先新增python中常用的資料分析庫 import numpy as np import pandas as pd import os import matplotlib.pyplot as plt import plotly as py import plotly.graph ob...

Python資料分析與挖掘實戰學習11

一 資料變換 1.連續屬性離散化 一些資料探勘演算法,特別是將某些分類演算法 如id3演算法 apriori演算法等 要求資料是分類屬性形式。這樣,常常需要將連續屬性變換成分類屬性,即連續屬性離散化。1 離散化的過程 連續屬性的離散化就是在資料的取值範圍內設定若干個離散的劃分點,將取值範圍劃分為一些...

資料分析實戰之資料清洗

在資料分析過程中不論是時間還是功夫,資料清洗大概佔到了80 一 資料質量的準則 完全合一 1 完整性 單條字段是否存在空值,統計的字段是否完善 2 全面性 觀察某一列的全部數值,根據常識判斷該列是否有問題,比如 資料定義 單位標識 數值本身。3 合法性 資料的型別 內容 大小的合法性 4 唯一性 資...