數據操做最重要的一步也是第一步就是收集數據,而收集數據的方式有不少種,第一種就是咱們已經將數據下載到了本地,在本地經過文件進行訪問,第二種就是須要到網站的API處獲取數據或者網頁上爬取數據,還有一種可能就是你的公司裏面有本身的數據庫,直接訪問數據庫裏面的數據進行分析。須要注意的是咱們不只須要將數據收集起來還要將不一樣格式的數據進行整理,最後再作相應的操做。html
訪問數據是數據分析的所必須的第一步,只有訪問到數據才能夠對數據進行分析。python
經常使用pandas解析函數:git
pandas提供了一些用於將表格型數據讀取爲DataFrame對象的函數。如下github
函數 | 描述 |
---|---|
read_csv | 從文件、url或者文件型對象讀取分割好的數據,逗號是默認分隔符 |
read_table | 從文件、url或者文件型對象讀取分割好的數據,製表符(‘\t’)是默認分隔符 |
read_fwf | 讀取定寬格式數據(無分隔符) |
read_clipboard | 讀取剪貼板中的數據,能夠看作read_table的剪貼板。再將網頁轉換爲表格 |
read_excel | 從Excel的XLS或者XLSX文件中讀取表格數據 |
read_hdf | 讀取pandas寫的HDF5文件 |
read_html | 從HTML文件中讀取全部表格數據 |
read_json | 從json字符串中讀取數據 |
read_pickle | 從Python pickle格式中存儲的任意對象 |
read_msgpack | 二進制格式編碼的pandas數據 |
read_sas | 讀取存儲於sas系統自定義存儲格式的SAS數據集 |
read_stata | 讀取Stata文件格式的數據集 |
read_feather | 讀取Feather二進制文件格式 |
read_sql | 將SQL查詢的結果(SQLAlchemy)讀取爲pandas的DataFrame |
咱們能夠經過上表對這些解析函數有一個簡單瞭解,其中read_csv和read_table是之後用得最多的兩個方法,接下來咱們主要就這兩個方法測試。web
csv文件就是一個以逗號分隔字段的純文本文件,用於測試的文件是自己是一個Excel文件,須要修改一下擴展名,可是簡單的修改後綴名不行,還須要將字符編碼改變爲utf-8
,由於默認的是ASCII
,不然是會報錯的。而後就能夠經過read_csv
將它讀入到一個DataFrame:正則表達式
import pandas as pd df = pd.read_csv("E:/Test/test3.csv") df name age sex 0 佩奇 18 女 1 喬治 19 男
注意:sql
到這裏可能就會有些人有疑問了,爲何個人文件路徑不對啊,那是由於在咱們這個方法當中的路徑當它往左斜的時候須要用雙斜槓,不然就要使用右斜槓數據庫
還可使用read_table,而且指定分隔符json
import pandas as pd df = pd.read_csv("E:/Test/test3.csv") df name age sex 0 佩奇 18 女 1 喬治 19 男
若是不指定分隔符,它的數據之間會有逗號。api
以上只是簡單的讀取操做
指定列名
pandas能夠幫助咱們自動分配列名,也能夠本身指定列名
默認列名
import pandas as pd df = pd.read_csv("E:/Test/test.csv",header=None) df 0 1 2 3 4 5 0 a b c d e f 1 g h i j k l 2 m n o p q r
指定列名
import pandas as pd df = pd.read_csv("E:/Test/test.csv",names=['數','據','分','析','真','好','玩']) df
具體還有那些參數,經過表格展現一下,這些參數是read_csv和read_table共有的
參數 | 描述 |
---|---|
path | 代表文件系統位置的字符串、URL或者文件型對象 |
sep或delimiter | 用於分隔每行字段的字符序列或正則表達式 |
header | 用做列名的行號,默認是0(第一行),若是沒有爲None |
names | 結果的列名列表,和header=None一塊兒用 |
skiprows | 從文件開頭起,須要跳過的行數或者行號列表 |
na_values | 用NA替換的值序列(能夠用來處理缺失值) |
data_parser | 用於解析日期的函數 |
nrows | 從文件開頭處讀取的行數 |
chunksize | 用於設置迭代的塊大小 |
encoding | 設置文本編碼 |
分塊讀取文件
剛纔咱們讀取文件是把整個文件都讀取出來了,那接下來咱們就嘗試分塊讀取文本文件,由於不是全部的文件內容都只有這麼少,咱們在實際運用當中會須要讀取文件的一個小片斷。
讀取大文件的時候能夠添加一個參數使得顯示的內容更加緊湊
import pandas as pd pd.options.display.max_rows = 3 df = pd.read_csv("E:/Test/test.csv") df
還能夠經過上面表格中提到的 nrows
參數選擇只讀取其中的幾行。
在Python中有一個自帶的序列化模塊pickle
,它是進行二進制格式操做存儲數據最高效、最方便的方式之一。在pandas中有一個to_pickle
方法能夠將數據以pickle
格式寫入硬盤
import pandas as pd df = pd.read_csv("E:/Test/test_j.csv") df.to_pickle("E:/Test/df_pickle")
運行完以後會發現沒反應,可是能夠打開你存儲的文件夾會發現這個pickle文件已經存到裏面了。
雖說這種方式很是方便,可是卻很難保證格式的長期有效性。一個今天被pickle化的對象可能明天會由於庫的新版本而沒法反序列化.在pandas當中還支持其餘的二進制格式。接着往下看
HDF5主要用於存儲大量的科學數組數據。以C庫的形式提供,而且有許多其餘語言的接口,例如:JAVA、Julia,固然還有咱們的Python。HDF5中的HDF
表明分層數據格式,每一個HDF5文件能夠存儲多個數據集而且支持元數據
pandas.read_hdf函數是使用HDF5格式的一個快捷方法
import pandas as pd import numpy as np frame = pd.DataFrame({'a':np.random.randn(100)}) frame.to_hdf("E:/Test/mydata.h5",'obj3',format='table') pd.read_hdf('E:/Test/mydata.h5','obj3',where=['index < 5'])
如今不少網站都有公開的API,經過JSON或者其餘什麼格式提供數據服務。那接下來,咱們就經過Python的requests模塊訪問Web API。
import requests import pandas as pd url = "https://api.github.com/repos/pandas-dev/pandas/issues" resp = requests.get(url) data = resp.json() # 由於data中的每一個元素都是一個字典,能夠直接將data傳給DataFrame,而且將其中本身喜歡的字段展現出來 issues = pd.DataFrame(data,columns=['number','title','labels','state']) issues
通過前面的瞭解,對於數據的導入以及存儲已經有了一個簡單的瞭解,可是在實際的工做狀況當中,拿到的數據不可能都是預想的格式,因此說,就須要經過一些文本處理工具將這種特殊數據從一種形式轉換爲另外一種能夠接受的形式,正好在Python的pandas庫當中就爲咱們提供了一個高級、靈活和快速的工具集,將數據轉換成想要的格式。
缺失數據在數據分析的應用當中是很常見的,pandas的目標之一就是儘量的無影響的處理缺失值。在pandas當中使用浮點值NaN(Not a Number來表是缺失值)。處理缺失值的最多見的兩種的方法:第一個就是直接將那個值丟棄,第二種方式就是補全缺失值。
屬性 | 描述 |
---|---|
dropna | 根據各標籤的值中是否存在缺失數據對軸標籤進行過濾。 |
fillna | 用指定值或插值方法(如ffill或bfill)填充缺失數據 |
isnull | 返回一個含有布爾值的對象,這些布爾值表示哪些值是缺失值/NA |
notnull | isnull的否認式 |
data = pd.Series(['pandas','numpy',np.nan,'matplotlib']) ------------------------------------------- data.isnull() 運行結果: 0 False 1 False 2 True 3 False dtype: bool # 返回一個布爾值數組 ------------------------------------------- data[0] = None # python中內置的None值在對象數組種也能夠做爲NA data.notnull() 運行結果: 0 False 1 True 2 False 3 True dtype: bool ------------------------------------------- data_1 = pd.Series([1,np.nan,3,np.nan,5.5,9]) data_1.dropna() # 丟棄任何含有缺失值的行 運行結果: 0 1.0 2 3.0 4 5.5 5 9.0 dtype: float64 # data_1[data_1.notnull()]等價於data_1.dropna()
以上都是對Series這種一維數組的缺失值處理,若是對於DataFrame這種二維數組的處理就會出現一些問題。
df = pd.DataFrame([[1,3,5,7,9],[2,4,6,np.nan],[1.5,5.,6.3,np.nan],[4.,2.3,np.nan,8,9.],[np.nan,np.nan,np.nan,np.nan,np.nan]]) df 運行結果: 0 1 2 3 4 0 1.0 3.0 5.0 7.0 9.0 1 2.0 4.0 6.0 NaN NaN 2 1.5 5.0 6.3 NaN NaN 3 4.0 2.3 NaN 8.0 9.0 4 NaN NaN NaN NaN NaN ------------------------------------------- cleaned = df.dropna() cleaned 運行結果: 0 1 2 3 4 0 1.0 3.0 5.0 7.0 9.0 # 全部帶有缺失值的行全被丟棄了
對於這種狀況能夠經過傳遞參數來解決:
df.dropna(how="all") # 丟棄全爲缺失值的行 運行結果: 0 1 2 3 4 0 1.0 3.0 5.0 7.0 9.0 1 2.0 4.0 6.0 NaN NaN 2 1.5 5.0 6.3 NaN NaN 3 4.0 2.3 NaN 8.0 9.0 ------------------------------------------- df[4] = np.nan df.dropna(axis=1,how="all") # 丟棄全爲缺失值的列 運行結果: 0 1 2 3 0 1.0 3.0 5.0 7.0 1 2.0 4.0 6.0 NaN 2 1.5 5.0 6.3 NaN 3 4.0 2.3 NaN 8.0 4 NaN NaN NaN NaN -------------------------------------------
有時候在操做數據的時候可能不想過濾掉缺失數據,由於有可能會丟棄和他有關的其餘數據,而是但願經過一些其餘方式來填補那些缺失的地方。fillna方法是處理這些問題最主要的方法。
df.fillna(0) # 替換缺失值爲0 運行結果: 0 1 2 3 4 0 1.0 3.0 5.0 7.0 0.0 1 2.0 4.0 6.0 0.0 0.0 2 1.5 5.0 6.3 0.0 0.0 3 4.0 2.3 0.0 8.0 0.0 4 0.0 0.0 0.0 0.0 0.0 ------------------------------------------- df.fillna({1:0.5,2:0}) # 對不一樣的列填充不一樣的值 0 1 2 3 4 0 1.0 3.0 5.0 7.0 NaN 1 2.0 4.0 6.0 NaN NaN 2 1.5 5.0 6.3 NaN NaN 3 4.0 2.3 0.0 8.0 NaN 4 NaN 0.5 0.0 NaN NaN ------------------------------------------- _ = df.fillna(0,inplace=True) df 運行結果: 0 1 2 3 4 0 1.0 3.0 5.0 7.0 0.0 1 2.0 4.0 6.0 0.0 0.0 2 1.5 5.0 6.3 0.0 0.0 3 4.0 2.3 0.0 8.0 0.0 4 0.0 0.0 0.0 0.0 0.0
使用fillna還能夠進行插值
df1 = pd.DataFrame(np.random.randn(6,3)) df1 運行結果: 0 1 2 0 0.475304 -1.274166 1.467016 1 -0.113910 0.935197 -1.008954 2 0.218006 0.209405 0.224217 3 1.878587 0.492774 -1.391237 4 -0.702284 0.863064 0.939069 5 -1.450531 0.994467 0.265843 # 一組數據數 ------------------------------------------- df1.iloc[2:,1] = np.nan # 將第二列第三行之後的數據都轉換爲缺失值 df1.iloc[4:,2] = np.nan # 將第三列第五行之後的數據都轉換爲缺失值 運行結果: 0 1 2 0 1.073202 0.644249 -0.089127 1 -0.028500 0.479373 -0.271212 2 1.575710 NaN -0.119795 3 -0.202480 NaN 0.385250 4 -1.090317 NaN NaN 5 0.985767 NaN NaN ------------------------------------------- df1.fillna(method='ffill') 運行結果: 0 1 2 0 1.073202 0.644249 -0.089127 1 -0.028500 0.479373 -0.271212 2 1.575710 0.479373 -0.119795 3 -0.202480 0.479373 0.385250 4 -1.090317 0.479373 0.385250 5 0.985767 0.479373 0.385250 # 參數limit還能夠設置替換的行
參數 | 說明 |
---|---|
value | 用於填充缺失值的標量值或字典對象 |
method | 插值方式。若是函數調用時未指定其餘參數的話,默認爲「ffill」 |
axis | 待填充的軸,默認axis=0 |
inplace | 修改調用者對象而不產生副本 |
limit | 能夠連續填充的最大數量 |
data = pd.DataFrame({"k1":['one','two'] * 3 + ['two'], "k2":[1,1,2,3,3,4,4]}) data 運行結果: k1 k2 0 one 1 1 two 1 2 one 2 3 two 3 4 one 3 5 two 4 6 two 4 ----------------------------------------------- data.duplicated() # 返回一個布爾型Series,表示各行是不是重複行 0 False 1 False 2 False 3 False 4 False 5 False 6 True dtype: bool ----------------------------------------------- data.drop_duplicates() # 返回一個DataFrame,重複的數組會標爲False k1 k2 0 one 1 1 two 1 2 one 2 3 two 3 4 one 3 5 two 4 # 重複的行被刪除了 -----------------------------------------------
以上方法是針對所有列,還能夠經過傳入參數對部分指定列進行重複項判斷。
data['v1'] = range(7) # 添加一個v1列 data.drop_duplicates(['k1','k2']) # 能夠傳入一個列表,指定列,默認保留第一個出現的值組合 k1 k2 v1 0 one 1 0 1 two 1 1 2 one 2 2 3 two 3 3 4 one 3 4 5 two 4 5 ----------------------------------------------- data.drop_duplicates(['k1','k2'],keep='last') # 默認保留最後一個出現的值組合 k1 k2 v1 0 one 1 0 1 two 1 1 2 one 2 2 3 two 3 3 4 one 3 4 6 two 4 6
data = pd.DataFrame({"goods":['Iphone','HUAWEI','SAMSUNG','MI','OPPO'], "price":[6000,4000,5000,3000,3000]}) data 運行結果: goods price 0 Iphone 6000 1 HUAWEI 4000 2 SAMSUNG 5000 3 MI 3000 4 OPPO 3000
如今有這樣一組數據,假設如今須要加上一列數據。將每樣商品的出產國家加上
# 先定義一個不一樣商品到產地的映射 produce_nation = { "iphone":'America', "huawei":'China', "samsung":'Korea', "mi":'China', "oppo":'China' } # 由於定義的商品全是大寫,須要所有轉換爲小寫 lower_cased = data['goods'].str.lower() # 經過map映射添加一列出產國家數據 data['nation'] = lower_cased.map(produce_nation) 運行結果: goods price nation 0 Iphone 6000 America 1 HUAWEI 4000 China 2 SAMSUNG 5000 Korea 3 MI 3000 China 4 OPPO 3000 China
也能夠經過一個函數完成這些工做:
data['goods'].map(lambda x:produce_nation[x.lower()]) 運行結果: 0 America 1 China 2 Korea 3 China 4 China Name: goods, dtype: object
利用fillna()方法填充缺失數據是值替換的一種特殊狀況。接下來可使用replace方法進行替換值操做。
data = pd.Series([1., -999., 2., -999., -1000., 3.]) data # 生成一個Series數組 運行結果: 0 1.0 1 -999.0 2 2.0 3 -999.0 4 -1000.0 5 3.0 dtype: float64 ---------------------------------------------- # 其中-999多是缺失值的某一標識,須要使用NA替代這些值 一、 data.replace(-999, np.nan) # 經過replace產生一個新的Series,除非傳入inplace=True 運行結果: 0 1.0 1 NaN 2 2.0 3 NaN 4 -1000.0 5 3.0 dtype: float64 二、 data.replace([-999, -1000], np.nan) # 一次性替換多個值 三、 data.replace([-999, -1000], [np.nan, 0]) # 替換不一樣的值,經過列表 四、 data.replace({-999: np.nan, -1000: 0}) # 替換不一樣的值,經過字典