1. 程式人生 > >pandas&pandas學習教程&DataFrame與Series資料結構

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]])   #索引列表也可以用於查詢第24,-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