數據分析----數據清洗

一、導入數據

import pandas as pd
import numpy as np
from pandas import Series,DataFrame
import xlrd
df = DataFrame(pd.read_excel('datas/grades.xlsx')) 
print(df)
   	Unnamed: 0  Unnamed: 1  Unnamed: 2  Unnamed: 3    
    0         蔣廣佳        43.0        69.0        61.0   
    1          廖菲        80.0        64.0        62.0    
    2         沈秀玲        68.0        74.0        98.0    
    3          韋丹        48.0        53.0        64.0    
    4         張夢雅        72.0        73.0        96.0   
    5         趙雅欣        60.0         NaN        70.0    
  • 我們可以看見上面的數據是缺少標註的,列名缺少標註;並且有很多是空值,因此我們要對數據進行清洗,提高數據的質量。在這裏數據清洗有四個要點簡稱“完全合一”
    • 整性:單條數據是否完整,統計的字段是否完善。
    • 面性:觀察某一列的全部數值,選中一列,我們可以看到最大值,最小值,平均值。我們可以通過常識判斷數據是否合理,比如:數據定義、單位標識、數值本身。
    • 法性:數據的類型、內容、大小的合法性。比如數據中存在非ASCII字符,性別存在未知,總分超過100等。
    • 性:數據是否存在重複記錄,由於數據來源於不同的渠道,重複的情況是非常常見的。行數據、列數據都需要是唯一的。- 事實上數據清洗的標準有差不多七八條,有興趣的可以瞭解一下,這裏歸納爲“完全合一”四條,按照這四條基本上可以解決數據清洗中的大部分問題,使得數據標準、乾淨、連續

二、開始數據清洗

1、完整性

problem 1:空行

  • solution: 刪除
df.dropna(how="all",inplace=True)

problem 2:缺失值

  • solution: - 刪除:刪除數據缺失的記錄 - 均值:使用當前列的均值 - 高頻:使用當前列出現平率最高的數據- 首先我們先把列的標註補上
df = df.rename(columns={'Unnamed: 0':'index','Unnamed: 1':'math','Unnamed: 2':'english','Unnamed: 3':'c++'})
df = df.drop(columns='index')
  • 現在我們想對df[‘math’]中缺失的值用平均值代替
df['math'].fillna(df['math'].mean(),inplace=True)
  • 如果想用最高頻率的數據對english進行填充,可以通過value_counts獲取math字段最高頻次english_maxf,然後對其進行填充
english_maxf = df['english'].value_counts().index[0]
df['english'].fillna(english_maxf,inplace=True)

2、全面性

problem:列數據單位不統一

solution:將不同的單位的找出來,將其進行迭代替換,比如說將榜(lbs)轉化爲千克(kgs)

# 獲取 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、合理性

problem:非ASCII字符

solution:對於非ASCII字符,我們可以採用刪除或者替換的方式,我們直接選擇刪除

df['name'].replace({r'[^\x00-\x7f]+':''},regex=True,inplace=True)

4、唯一性

problem1:一列有多個參數

solution:比如英文名字,是有兩部分組成的,包含兩個參數Firstname、Lastnamr,我們需要將name一列拆分爲Firstname和Lastname兩個字段,我們可以採用split方法,對其進行切分

df['First_namr','Last_name'] = df['name'].str.split(expand=True)
df.drop('name',axis=1,inplace=True)

problem2:重讀數據

solution:我們校驗數據是否存在重複數據,如果有重複數據,如果就用pandas提供的drop_duplicates()來刪除重複數據。

df.drop_duplicates(['First_name','Last_name'],inplace=True)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章