數據操做

數據操做

一 、本章學習內容:

  • 數據導入、存儲
  • 數據處理

數據操做最重要的一步也是第一步就是收集數據,而收集數據的方式有不少種,第一種就是咱們已經將數據下載到了本地,在本地經過文件進行訪問,第二種就是須要到網站的API處獲取數據或者網頁上爬取數據,還有一種可能就是你的公司裏面有本身的數據庫,直接訪問數據庫裏面的數據進行分析。須要注意的是咱們不只須要將數據收集起來還要將不一樣格式的數據進行整理,最後再作相應的操做。html

undefined

二 、數據導入、存儲

訪問數據是數據分析的所必須的第一步,只有訪問到數據才能夠對數據進行分析。python

2.1 文本格式

經常使用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

undefined

咱們能夠經過上表對這些解析函數有一個簡單瞭解,其中read_csv和read_table是之後用得最多的兩個方法,接下來咱們主要就這兩個方法測試。web

2.1.1 read_csv

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

到這裏可能就會有些人有疑問了,爲何個人文件路徑不對啊,那是由於在咱們這個方法當中的路徑當它往左斜的時候須要用雙斜槓,不然就要使用右斜槓數據庫

2.1.2 read_table

還可使用read_table,而且指定分隔符json

import pandas as pd
df = pd.read_csv("E:/Test/test3.csv")
df

name    age sex
0   佩奇  18  女
1   喬治  19  男

數據處理_tabl

若是不指定分隔符,它的數據之間會有逗號。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

recv_table2

指定列名

import pandas as pd
df = pd.read_csv("E:/Test/test.csv",names=['數','據','分','析','真','好','玩'])
df

recv_table3

具體還有那些參數,經過表格展現一下,這些參數是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

undefined

還能夠經過上面表格中提到的 nrows 參數選擇只讀取其中的幾行。

2.2 二進制

2.2.1 pickle

在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當中還支持其餘的二進制格式。接着往下看

2.2.2 HDF5

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'])

undefined

undefined

2.3 Web API

如今不少網站都有公開的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

undefined

三 、數據處理

通過前面的瞭解,對於數據的導入以及存儲已經有了一個簡單的瞭解,可是在實際的工做狀況當中,拿到的數據不可能都是預想的格式,因此說,就須要經過一些文本處理工具將這種特殊數據從一種形式轉換爲另外一種能夠接受的形式,正好在Python的pandas庫當中就爲咱們提供了一個高級、靈活和快速的工具集,將數據轉換成想要的格式。

undefined

3.1 處理缺失值

缺失數據在數據分析的應用當中是很常見的,pandas的目標之一就是儘量的無影響的處理缺失值。在pandas當中使用浮點值NaN(Not a Number來表是缺失值)。處理缺失值的最多見的兩種的方法:第一個就是直接將那個值丟棄,第二種方式就是補全缺失值。

屬性 描述
dropna 根據各標籤的值中是否存在缺失數據對軸標籤進行過濾。
fillna 用指定值或插值方法(如ffill或bfill)填充缺失數據
isnull 返回一個含有布爾值的對象,這些布爾值表示哪些值是缺失值/NA
notnull isnull的否認式

3.2 過濾缺失值

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
-------------------------------------------

3.3 補全缺失值

有時候在操做數據的時候可能不想過濾掉缺失數據,由於有可能會丟棄和他有關的其餘數據,而是但願經過一些其餘方式來填補那些缺失的地方。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 能夠連續填充的最大數量

undefined

四 、數據轉換

4.1 刪除重複值

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

4.2 使用函數或映射進行數據轉換

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

4.3 替換值

利用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})  # 替換不一樣的值,經過字典

undefined

相關文章
相關標籤/搜索