pandas&pandas學習教程&DataFrame與Series資料結構
安裝:
pandas的最小依賴項為:
NumPy,python-dateutil,pytz
安裝pandas前需先安裝上述三個依賴項。
pandas官網文件強調,pandas專案名稱中的字母應該全部採用小寫形式,同時匯入pandas庫應採用import pandas as pd
。
1.pandas的DataFrame資料結構
DataFrame是一種帶標籤的二維物件。
建立方式為:
- 從另一個DataFrame建立DataFrame
- 從具有二維形狀的NumPy陣列建立
- 用pandas的另一種資料結構Series建立
- 從CSV之類的檔案建立
from pandas.io.parsers import read_csv
df = read_csv("hahaha.csv" ) #從CSV中讀取
print("Dataframe",df) #顯示內容
print(df.shape) #資料結構的形狀
print(len(df)) #長度
print(df.columns) #每一列的標題 df.columns[2]
print(df.dtypes) #每一列的資料型別 df.dtypes[2]
print(df.index) #每一行的索引號
print(df.values) #資料結構的值
print(df.values[4]) #通過索引檢索每一行的值
DataFrame的索引可以由pandas自動建立,或是手動規定。
2.pandas的DataFrame資料結構
建立方式為:
- 由Python字典建立
- 由NumPy陣列建立
- 由單個標量值建立
建立Series資料結構時,可以向建構函式遞交一組軸標籤,這些標籤通常稱為索引,是一個可選引數。通常,如果numpy作為輸入資料,那麼pandas將索引值從0開始自動遞增。如果傳遞的為python字典,則鍵值為索引。如果輸入的為標量值,則需手動提供索引值。
from pandas.io.parsers import read_csv
df = read_csv("WHO_first9cols.csv" ) #從CSV中讀取
first_col = df[df.columns[0]] #選中DataFrame一列,則為Series型資料
print(first_col.dtypes) #輸出型別,numpy的函式同樣適用於pandas
print(np.sum(first_col - first_col.values)) #numpy的函式適用於DataFrame與Series
print(first_col.shape) #輸出每維的長度
print(first_col.index) #索引
print(first_col.values) #值,索引方式first_col.valuse[4]
print(first_col.name) #該列或者Series資料的名字,第一行
print(first_col[1:4]) #Series具有切片功能
3.利用pandas查詢資料
從Quandl檢索年度太陽黑子資料。可以安裝Quandl程式包:
pip install Quandl
查詢函式如下:
import quandl
sunspots = quandl.get('SIDC/SUNSPOTS_A')
print(sunspots.head(2)) #前n條記錄
print(sunspots.tail(2)) #後n條記錄
last_date = sunspots.index[-1] #取最新一年的索引
print(sunspots.loc[last_date]) #取最新一年的資料
print(sunspots["20020102":"20131231"]) #通過YYYYMMDD格式的日期字串來查詢日期
print(sunspots.iloc[[2,4,-2,-4]]) #索引列表也可以用於查詢第2,4,-2,-4的值,sunspots.iloc[2]
print(sunspots.iloc[0,0]) #通過索引查詢標量值,第一個表示行,第二個表示列
print(sunspots.iat[0,0]) #通過索引查詢標量值,第一個表示行,第二個表示列,速度更快
print(sunspots[sunspots>sunspots.mean]) #查詢布林型變數的方法,查詢所有資料行,與條件不符的行賦予Nan值
4.利用pandas的DataFrame進行統計計算
import quandl
sunspots = quandl.get('SIDC/SUNSPOTS_A')
print(sunspots.describe()) #返回描述性統計資訊,例如每行的非Nan資料項數量,mead值,std值,min值,max值,各種位數。
print(sunspots.count()) #返回每行非Nan的資料的數量
print(sunspots.mad()) #每行平均絕對誤差,類似於標準差的一個有力的統計工具
print(sunspots.median()) #每行的中位數
print(sunspots.min()) #最小值
print(sunspots.max()) #最大值
print(sunspots.mode()) #返回一個眾數,即出現次數最多的數
print(sunspots.std()) #標準差,方差的平方根
print(sunspots.var()) #返回方差
print(sunspots.skew()) #偏態係數,即資料分佈的對稱程度
print(sunspots.kurt()) #返回資料分佈曲線頂端尖峭或扁平程度
5.利用pandas的DataFrame實現資料聚合
import numpy as np
import pandas as pd
data = {'Weather' : ['cold', 'hot', 'cold', 'hot',
'cold', 'hot', 'cold'],
'Food' : ['soup', 'soup', 'icecream', 'chocolate',
'icecream', 'icecream', 'soup'],
'Price' : 10 * np.random.rand(7), 'Number' : np.random.random_integers(1, 9, size=(7,))}
df = pd.DataFrame(data) #根據字典建立DataFrame
weather_group = df.groupby('Weather') #資料聚合,按weather分組
i = 0
for name , group in weather_group: #name為weather的名字,group為該類中的項
i = i + 1
print(i,name)
print(group)
print(weather_group.first()) #輸出各組資料的第一行
print(weather_group.last()) #輸出各組資料的最後一行
print(weather_group.mean()) #輸出各組的平均值
##以兩種資料分組
wf_group = df.groupby(['Weather','Food'])
for name, group in wf_group:
print(name)
print(group)
##以兩種資料分組
##通過agg()可以對資料組施加一系列的NumPy函式
print(wf_group.agg([np.mean,np.median]))
##通過agg()可以對資料組施加一系列的NumPy函式
6.DataFrame的串聯與附加操作
import numpy as np
import pandas as pd
data = {'Weather' : ['cold', 'hot', 'cold', 'hot',
'cold', 'hot', 'cold'],
'Food' : ['soup', 'soup', 'icecream', 'chocolate',
'icecream', 'icecream', 'soup'],
'Price' : 10 * np.random.rand(7), 'Number' : np.random.random_integers(1, 9, size=(7,))}
df = pd.DataFrame(data) #根據字典建立DataFrame
print(pd.concat([df[:3],df[3:]])) #串聯
print(df[:3].append(df[5:])) #串聯
7.連線DataFrame
pandas提供的merge()或DataFrame的join()都能實現類似資料庫的連線操作功能。預設情況下,join()會按照索引進行連線。連結分為:內部連線、左外連線、右外連線與完全外部連線等。內部操作,指從兩個資料表中選取資料,只要兩個表中連線條件規定的列上存在相匹配的值,相應的資料就會被組合起來。對於外部連線,由於不需要進行匹配處理,將會返回很多資料。
import numpy as np
import pandas as pd
dests = pd.read_csv('dest.csv')
tips = pd.read_csv('tips.csv')
print(pd.merge(dests,tips,on='EmpNr')) #內部連結,按員工編號進行連線處理
print(dests.join(tips,lsuffix='Dest',rsuffix='Tips')) #索引值連結,感覺不太好用
print(pd.merge(dests,tips,how='inner')) #內部連線
print(pd.merge(dests,tips,how='outer')) #外部連線
注意:列中非數字的數值可能會被標為nan,這些通常是由輸入資料檔案中的空欄位引起的。
8.處理缺失資料問題
對於pandas來說會將缺失資料標記為NaN,表示None。對於NaN進行算數運算是,得到的結果還是NaN。如果進行統計學方法,如求和或者求平均數,可能會將NaN當作0看待。然而,在求和過程中,如果所有資料都是NaN,則結果為NaN。進行聚合操作時,我們組合的列內的NaN值會被忽略。數+np.nan = nan。
import numpy as np
import pandas as pd
df = pd.read_csv('WHO_first9cols.csv')
df = df[['Country',df.columns[-2]]][:2] #選兩列三行
null = pd.isnull(df) #檢查缺失資料,缺失資料用NaN表示
notnull = pd.notnull(df) #檢查非NaN資料
#數+np.nan = nan
print(df.fillna(0)) #用0補NaN
9.處理日期資料
pandas可以處理的日期範圍為1677年9月21日00:12:44——2262年4月11日23:47:16
import numpy as np
import pandas as pd
print(pd.date_range('1/1/1990',periods=42,freq='D'))#生成時間列表,週期為42天,D
print(pd.to_datetime(['19931112','1/1/1992']))#將字串轉化為日期資料
10.資料透視表
pandas的API提供了pivot_table()
函式,只要設定好aggfunc
引數,就可以讓這個聚合函式來執行NumPy中諸如sum(),max()
之類的方法。引數columns
表示要對哪些列進行聚合運算。
import numpy as np
import pandas as pd
data = {'Weather' : ['cold', 'hot', 'cold', 'hot',
'cold', 'hot', 'cold'],
'Food' : ['soup', 'soup', 'icecream', 'chocolate',
'icecream', 'icecream', 'soup'],
'Price' : 10 * np.random.rand(7), 'Number' : np.random.random_integers(1, 9, size=(7,))}
df = pd.DataFrame(data) #根據字典建立DataFrame
print(pd.pivot_table(df,columns=['Food'],aggfunc=np.max)) #np.max不能加括號
print(pd.pivot_table(df,columns=['Food'],aggfunc=np.sum)) #np.sum不能加括號
WALDM