Python資料科學(六) 資料清理(Ⅰ)

一隻寫程式的猿發表於2017-12-14

Python資料科學(六)  資料清理(Ⅰ)
傳送門:

成功爬取到我們所需要的資料以後,接下來應該做的是對資料進行清理和轉換, 很多人遇到這種情況最自然地反應就是“寫個指令碼”,當然這也算是一個很好的解決方法,但是,python中還有一些第三方庫,像Numpy,Pandas等,不僅可以快速簡單地清理資料,還可以讓非程式設計的人員輕鬆地看見和使用你的資料。接下來就讓我們一起學習使用Pandas!

1.Pandas

Python資料科學(六)  資料清理(Ⅰ)

什麼是Pandas? 百度百科:Python Data Analysis Library 或 pandas 是基於NumPy 的一種工具,該工具是為了解決資料分析任務而建立的。Pandas 納入了大量庫和一些標準的資料模型,提供了高效地操作大型資料集所需的工具。pandas提供了大量能使我們快速便捷地處理資料的函式和方法。你很快就會發現,它是使Python成為強大而高效的資料分析環境的重要因素之一。

以下我們主要通過一些範例進行學習。

1.資料篩選

Python資料科學(六)  資料清理(Ⅰ)

#儲存元素與切割
import pandas as pd
df = pd.DataFrame(info)
df.ix[1]
複製程式碼

Python資料科學(六)  資料清理(Ⅰ)

# 檢視特定的列
df[['name', 'age']]
複製程式碼

Python資料科學(六)  資料清理(Ⅰ)

# 檢視特定列的特定內容
df.ix[1:2, ['name', 'age'] ]
複製程式碼

Python資料科學(六)  資料清理(Ⅰ)

  • 使用 & 取條件交集
df[(df['gender'] == 'M')&(df['age'] >= 30)]
複製程式碼
  • 使用 | 取條件集合
df[(df['gender'] == 'M')|(df['age'] >= 30)]
複製程式碼
  • 新增/刪除欄位
    Python資料科學(六)  資料清理(Ⅰ)
 # 新增欄位
df['employee'] = True

# 刪除欄位
del df['employee']    OR   df = df.drop('employee', 1)

# 新增第六列
df.loc[6] = {'age':20, 'gender':'F', 'name':'qoo'}
OR
df.append(pd.DataFrame([{'age':20, 'gender':'F', 'name':'qoo'}]), ignore_index=True)

# 刪除第六列
df = df.drop(6)
複製程式碼
  • 設定新的索引
# 新增的欄位
df['userid'] = range(101, 107) 

# 設定新的索引
df. set_index('userid', inplace=True)
複製程式碼

Python資料科學(六)  資料清理(Ⅰ)

  • 根據位置取值
# iloc可以根據位置取值
df.iloc[1]
複製程式碼

Python資料科學(六)  資料清理(Ⅰ)

# 檢視1,3,5 列的資料
df.iloc[[1,3,5]]
複製程式碼

Python資料科學(六)  資料清理(Ⅰ)

  • 根據索引取值
# 使用ix取值,通過行號索引 
df.ix[[101,103,105]]

# 使用loc取值,即使用標籤索引行資料
df.loc[[101,103,105]]
複製程式碼

2.偵測遺失值

  • 缺失值是指資料中有特定或者一個範圍的值是不完全的
  • 缺失值可能會導致資料分析時產生偏誤的推論
  • 缺失值可能來自機械的缺失或者人為的缺失
    • 機械缺失 例: 機械故障,導致資料無法被完整儲存
    • 人為缺失 例:受訪者拒絕透露部分資訊
import pandas as pd
import numpy as np
df = pd.DataFrame([\
                  ['frank', 'M', np.nan],\
                  ['mary', np.nan, np.nan],\
                  ['tom', 'M', 35],\
                  ['ted', 'M', 33],\
                  ['jean', np.nan, 21],\
                  ['lisa', 'F', 20]]
)
df. columns = ['name', 'gender', 'age']
df 
複製程式碼

Python資料科學(六)  資料清理(Ⅰ)

  • 檢查序列是否有缺失值
# 檢查非缺失值資料
df['gender'].notnull()

# 檢查缺失值資料
df['gender'].isnull()
複製程式碼
  • 檢查欄位是否含有缺失值
# 檢查欄位是否含有缺失值
df['age'].isnull().values.any()

# 檢查DataFrame 是否還有缺失值 返回True/False
df.isnull().values.any()
複製程式碼
  • 計算缺失值的數量
# 檢查某個欄位缺失值的數量
df['age'].isnull().sum()

# 檢查欄位缺失值的數量
df.isnull().sum()

# 計算所有缺失值的數量
df.isnull().sum().sum()
複製程式碼

分開計算每一欄缺失值的數量

3.補齊遺失值

處理缺失值常規的有以下幾種方法

  • 捨棄缺失值
    • 這種情況適用於當缺失值佔資料比例很低時
  • 使用平均數、中位數、眾數等敘述性統計補齊缺失值
  • 使用內插法補齊缺失值
    • 如果欄位資料成線性規律

1.捨棄缺失值

  • 捨棄含有任意缺失值的行
df.dropna()
複製程式碼
  • 捨棄所有欄位都含有缺失值的行
df.dropna(how='all')
複製程式碼
  • 捨棄超過兩欄缺失值的行
df.dropna(thresh=2)
複製程式碼

2.捨棄含有缺失值的列

  • 增加一包含缺失值的列
df['employee'] = np.nan
複製程式碼
  • 捨棄皆為缺失值的列
df.dropna(axis=1, how = 'all')
複製程式碼
  • 使用0值表示沿著每一列或行標籤\索引值向下執行方法
  • 使用1值表示沿著每一行或者列標籤模向執行對應的方法

下圖代表在DataFrame當中axis為0和1時分別代表的含義(axis引數作用方向圖示):

Python資料科學(六)  資料清理(Ⅰ)

3.填補缺失值

  • 用0填補缺失值
df.fillna(0)
複製程式碼
  • 用平均數缺失值 df['age'].mean()是age這個欄位平均值
df['age'].fillna(df['age'].mean())  
複製程式碼
  • 用各性別年齡平均填缺失值
df['age'].fillna(df.groupby('gender')['age'].transform('mean'), inplace = True)
複製程式碼

4.向前/向後填值

  • 向後填補缺失值
df.fillna(method='pad')
複製程式碼
  • 向前填補缺失值
df.fillna(method='bfill', limit=2)
複製程式碼
  • pad/ffill:往後填值
  • bfill/backfill:往前填值

注意:這裡的往前往後是指的從上往下

5.使用內插法填補缺失值

df2 = pd.DataFrame([[1,870],\
                   [2,900],\
                   [np.nan,np.nan],\
                   [4,950],\
                   [5,1080],\
                   [6,1200]])
df2.columns = ['time', 'val']
df2.interpolate()
複製程式碼

按照線性規律填補完的結果

6.總結

上一階段我們已經爬取了房天下的二手房資訊,這裡對我們抓取到的二手房資訊進行處理

# 把暫無資料替換成物業費
df[df['物業費'] == ‘暫無資料’, ‘物業費’] = np.nan

# 在開啟檔案的時候,直接把暫無資料替換成缺失值
df = pandas.read_csv('data/house_data.csv', na_values = '暫無資料', index_col = 0)

# 檢視前三行資料
df.head(3)

# 檢視後三行資料
df.tail(3)
複製程式碼
  • 檢視DataFrame資訊
df.info()
複製程式碼

Python資料科學(六)  資料清理(Ⅰ)

  • 檢視欄位名稱
df.columns
複製程式碼

Python資料科學(六)  資料清理(Ⅰ)

  • 檢視欄位型態
df.dtypes
複製程式碼

Python資料科學(六)  資料清理(Ⅰ)

  • 取得敘述性統計
df.describe()
複製程式碼

Python資料科學(六)  資料清理(Ⅰ)

  • 判斷欄位是否有缺失值的存在
df.isnull().any()
複製程式碼

Python資料科學(六)  資料清理(Ⅰ)

  • 統計欄位缺失值的數量
df.isnull().sum()
複製程式碼

Python資料科學(六)  資料清理(Ⅰ)

  • 捨棄參考月供這一列
df = df.drop('參考月供', axis = 1)
複製程式碼
  • 篩選欄位,篩選出產權性質中各種產權所佔的數量
df['產權性質'].value_counts()
複製程式碼

Python資料科學(六)  資料清理(Ⅰ)

  • 篩選出建築面積大於100且總價大於2000萬的房產資訊 注意:ix[ ,]中,前是條件,,是欄位
df.ix[(df['建築面積'] > 100) & (df['總價'] > 2000), ].head(1)
複製程式碼

Python資料科學(六)  資料清理(Ⅰ)

  • 篩選出產權性質為個人產權的房產資訊
df = df[df['產權性質'] == ‘個人產權’]
複製程式碼
  • 對總價中缺失值進行合理的補全
df['總價'] = df['總價'].fillna(df['建築面積'] * (df['總價'] / df['建築面積']).mean())
複製程式碼
  • 將資料寫入CSV中
df.to_csv('house_final.csv', index_label = False)
複製程式碼

相關文章