成功爬取到咱們所須要的數據之後,接下來應該作的是對資料進行清理和轉換, 不少人遇到這種狀況最天然地反應就是「寫個腳本」,固然這也算是一個很好的解決方法,可是,python中還有一些第三方庫,像Numpy,Pandas等,不只能夠快速簡單地清理數據,還可讓非編程的人員輕鬆地看見和使用你的數據。接下來就讓咱們一塊兒學習使用Pandas!python
什麼是Pandas? 百度百科:
Python Data Analysis Library 或 pandas 是基於NumPy 的一種工具,該工具是爲了解決數據分析任務而建立的。Pandas 歸入了大量庫和一些標準的數據模型,提供了高效地操做大型數據集所需的工具。pandas提供了大量能使咱們快速便捷地處理數據的函數和方法。你很快就會發現,它是使Python成爲強大而高效的數據分析環境的重要因素之一。編程
如下咱們主要經過一些範例進行學習。bash
#存儲元素與切割
import pandas as pd
df = pd.DataFrame(info)
df.ix[1]
複製代碼
# 查看特定的列
df[['name', 'age']]
複製代碼
# 查看特定列的特定內容
df.ix[1:2, ['name', 'age'] ]
複製代碼
df[(df['gender'] == 'M')&(df['age'] >= 30)]
複製代碼
df[(df['gender'] == 'M')|(df['age'] >= 30)]
複製代碼
# 新增欄位
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)
複製代碼
# iloc能夠根據位置取值
df.iloc[1]
複製代碼
# 查看1,3,5 列的數據
df.iloc[[1,3,5]]
複製代碼
# 使用ix取值,經過行號索引
df.ix[[101,103,105]]
# 使用loc取值,即便用標籤索引行數據
df.loc[[101,103,105]]
複製代碼
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
複製代碼
# 檢查非缺失值數據
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()
複製代碼
處理缺失值常規的有如下幾種方法app
df.dropna()
複製代碼
df.dropna(how='all')
複製代碼
df.dropna(thresh=2)
複製代碼
df['employee'] = np.nan
複製代碼
df.dropna(axis=1, how = 'all')
複製代碼
- 使用0值表示沿着每一列或行標籤\索引值向下執行方法
- 使用1值表示沿着每一行或者列標籤模向執行對應的方法
下圖表明在DataFrame當中axis爲0和1時分別表明的含義(axis參數做用方向圖示): 函數
df.fillna(0)
複製代碼
df['age'].mean()
是age這個字段平均值df['age'].fillna(df['age'].mean())
複製代碼
df['age'].fillna(df.groupby('gender')['age'].transform('mean'), inplace = True)
複製代碼
df.fillna(method='pad')
複製代碼
df.fillna(method='bfill', limit=2)
複製代碼
- pad/ffill:日後填值
- bfill/backfill:往前填值
注意:這裏的往前日後是指的從上往下工具
df2 = pd.DataFrame([[1,870],\
[2,900],\
[np.nan,np.nan],\
[4,950],\
[5,1080],\
[6,1200]])
df2.columns = ['time', 'val']
df2.interpolate()
複製代碼
上一階段咱們已經爬取了房天下的二手房信息,這裏對咱們抓取到的二手房信息進行處理post
# 把暫無資料替換成物業費
df[df['物業費'] == ‘暫無資料’, ‘物業費’] = np.nan
# 在打開文件的時候,直接把暫無資料替換成缺失值
df = pandas.read_csv('data/house_data.csv', na_values = '暫無資料', index_col = 0)
# 檢視前三行數據
df.head(3)
# 檢視後三行資料
df.tail(3)
複製代碼
df.info()
複製代碼
df.columns
複製代碼
df.dtypes
複製代碼
df.describe()
複製代碼
df.isnull().any()
複製代碼
df.isnull().sum()
複製代碼
df = df.drop('參考月供', axis = 1)
複製代碼
df['產權性質'].value_counts()
複製代碼
,
前是條件,,
是欄位df.ix[(df['建築面積'] > 100) & (df['總價'] > 2000), ].head(1)
複製代碼
df = df[df['產權性質'] == ‘我的產權’]
複製代碼
df['總價'] = df['總價'].fillna(df['建築面積'] * (df['總價'] / df['建築面積']).mean())
複製代碼
df.to_csv('house_final.csv', index_label = False)
複製代碼