想入門 Pandas,那么首先需要了解Pandas中的數(shù)據(jù)結(jié)構(gòu)。因為Pandas中數(shù)據(jù)操作依賴于數(shù)據(jù)結(jié)構(gòu)對象。Pandas中最常用的數(shù)據(jù)結(jié)構(gòu)是 Series 和 DataFrame。這里可以將 Series和 DataFrame分別看作一維數(shù)組和二維數(shù)組。 Series Series是一維標簽數(shù)組,其可以存儲任何數(shù)據(jù)類型,包括整數(shù),浮點數(shù),字符串等等。所謂標簽數(shù)組,這里的標簽即是指Series的索引。 import pandas as pd
除了使用傳入列表或numpy數(shù)組之外,也可以通過字典的方式創(chuàng)建: s=pd.Series({'a':5, 'b':4, 'c':3, 'd':2, 'e':1}) DataFrameDataFrame是一種表格型數(shù)據(jù)結(jié)構(gòu),可以看作是具有行列標簽的二維數(shù)組。每列可以是不同類型的數(shù)據(jù),比如數(shù)值,字符串,邏輯值等。 DataFrame的創(chuàng)建有多種方式,比較常用的是通過字典的方式創(chuàng)建,此外,還可以給定數(shù)組,通過指定columns和index參數(shù)創(chuàng)建: d1=pd.DataFrame({'one':[1,3,5], 'two':[2,4,6]}) # 不指定索引,默認仍從0開始。 簡單的介紹了Series和DataFrame這兩種數(shù)據(jù)結(jié)構(gòu)之后,我們以全國空氣質(zhì)量歷史數(shù)據(jù)(http://beijingair.sinaapp.com)為例,通過實際的數(shù)據(jù)處理來介紹一下常用的操作。 數(shù)據(jù)為逗號分隔的csv格式數(shù)據(jù),數(shù)據(jù)存儲如下: 數(shù)據(jù)存儲以逗號作為分隔符,列為: date, hour, type, 1001A, 1002A…,date和hour為時間信息列,type為對應(yīng)的要素,其余的列均為站點名稱。 讀取數(shù)據(jù)data = pd.read_csv('china_sites_20170101.csv', sep=',') 由于文件中存儲了多行多列數(shù)據(jù),因此,完全讀取之后 data 為 DataFrame 類型。 探索性分析查看DataFrame數(shù)據(jù)信息 data.shape 查看數(shù)據(jù)行列對象信息 data.info() 上述數(shù)據(jù)中包含285行,1500列,其中type列為object,date和hour列為int64類型,其余列均為float64類型。memory表明數(shù)據(jù)總共占用了約3.3M內(nèi)存。 數(shù)據(jù)統(tǒng)計信息 獲取每一列的統(tǒng)計相關(guān)數(shù)據(jù),count表示一列的行數(shù),mean表示均值,std為標準差,min和max表示最小值和最大值,25%,50%和75%分別表示1/4位數(shù),中位數(shù)和3/4位數(shù)。 data.describe()
簡單的數(shù)據(jù)查看 head 方法可以查看整個數(shù)據(jù)集的前幾行信息,默認是前5行,但可以指定參數(shù)選擇,與 head 對應(yīng)的是 tail 可以查看對應(yīng)的從末尾開始的默認5行數(shù)據(jù)。這兩個方法類似linux中的 head 和 tail 命令。 data.head() 數(shù)據(jù)選擇 簡單的了解了上述信息之后,我們對不同的空氣質(zhì)量要素進行操作時就要涉及到數(shù)據(jù)的選擇。
Pandas主要有兩種數(shù)據(jù)查詢選擇操作:
Pandas在選擇列時,無需使用 date[:, columns] 的形式,先使用 : 選擇所有行,再指定 columns 列名稱。選擇1001A站點的數(shù)據(jù)。 data[['date', 'hour', 'type', '1001A']] # 獲取四列所有行數(shù)據(jù),仍為DataFrame data[0:5] # 選擇所有列前5行數(shù)據(jù),僅包括索引0-4行 超綱題:由于數(shù)據(jù)中包含了時間信息列(date和hour),為了方便操作,我們可以使用以下命令將時間列設(shè)置為索引。 date_index = pd.to_datetime(data.date.apply(lambda x: str(x)) + data.hour.apply(lambda x: '%02d'%x), format='%Y%m%d%H')
data.loc[:, '1001A'] # 返回Series 注意 : 行索引,如果僅給定 data.loc['1001A'] 會出錯 data.loc[:, ['1001A', '1006A', '2706A']] data.loc['2017-01-01 00:00:00':'2017-01-01 06:00:00', '1001A':'1005A'] # 針對行和列均進行切片
data.loc[data['type'] == 'AQI'] # 選擇所有站點的AQI數(shù)據(jù) def test(data, column, name): data.iloc[0] # 返回第1行的所有列,結(jié)果為Series data.iloc[[0,2,4,6,8], [0,1,2,3]] data.iloc[0:10, 0:4] data.iloc[(data.type == 'AQI').values] # 獲取所有站點的AQI數(shù)據(jù)
上述兩種數(shù)據(jù)選擇雖是基于DataFrame,但Series也支持同樣的操作,以1001A 站點的AQI數(shù)據(jù)為例: s = data.loc[data.type == 'AQI']['1001A'] 由于Series只有一列,因此只需要對行進行索引操作即可,也支持基于標簽和整數(shù)的位置索引方式。 s.loc['2017-01-01 06:00:00':'2017-01-01 12:00:00'] 重建索引 通過觀察1001A站點的Series數(shù)據(jù)可以發(fā)現(xiàn):某些時刻的數(shù)據(jù)缺失。對于時間序列數(shù)據(jù)而言,數(shù)據(jù)的缺失可能會導(dǎo)致分析時出現(xiàn)問題。因為,我們需要補齊所有時刻。 from datetime import datetime 缺失值 補齊所有時刻之后,我們可以查看一下數(shù)據(jù)的缺失情況: data.isnull() # 返回邏輯DataFrame,缺失值為True,否則為False
但對于時間序列而言,一般不選擇直接丟棄缺失時刻,否則可能造成時間缺失,破壞連續(xù)性。因此,可以選擇補齊數(shù)據(jù)。 data.fillna() # fillna 使用給定值和方法進行數(shù)據(jù)填補 統(tǒng)計計算 Pandas中Series和DataFrame均包含一些常用的統(tǒng)計計算方法,比如: data.mean() # 計算平均值 上述數(shù)據(jù)是2017年1月1日全國所有觀測站觀測的常規(guī)要素逐小時數(shù)據(jù),上面幾個統(tǒng)計命令均是對每個站點每個要素進行計算。此外,也可以對單個站點分時刻計算,比如: data['1001A'].resample('6h').mean() # 針對1001A站點,進行每6小時求平均
對行或列應(yīng)用函數(shù): 上面在創(chuàng)建時間索引時便利用了 pd.to_datetime(data.date.apply(lambda x: str(x)) + data.hour.apply(lambda x: '%02d'%x), format='%Y%m%d%H') 字符串函數(shù) Series中提供了大量的字符串函數(shù),可以對字符串類型的數(shù)據(jù)進行常規(guī)操作。比如想替換字符串,或者轉(zhuǎn)換字符串大小寫等等。 data.type.str.replace('PM2.5', 'PM2_5') # 或 data.type.replace('PM2.5', 'PM2_5') 軸轉(zhuǎn)換 目前的數(shù)據(jù)存儲形式是:站點作為列,每個站點的空氣質(zhì)量要素通過 type 列單獨給定。有時候這種存儲形式并不方便,我們想要為以下形式: 即獲取每個站點時,可以直接獲取當前站點的所有要素數(shù)據(jù),而且時間索引也按照單個時刻排列,索引不會出現(xiàn)重復(fù)值,而之前的存儲形式索引會出現(xiàn)重復(fù)。索引重復(fù)會使得某些操作出錯。 我們可以通過 data.pivot_table(index=data.index, columns=['type']) 索引仍為 data 的原索引,但對 type 列進行旋轉(zhuǎn)。旋轉(zhuǎn)完成之后返回的DataFrame的列為 MultiIndex。而關(guān)于 MultiIndex 的查詢操作屬于高級主題。 對于 MultiIndex 的操作,同樣可以使用
idx = pd.IndexSlice
上述操作返回的列仍然是 sub.xs('1001A', axis=1) 簡單繪圖 在 Python可視化工具概覽 中我們提到過數(shù)據(jù)處理和可視化一條龍服務(wù)的Pandas,Pandas不僅可以進行數(shù)據(jù)處理工作,而且其還封裝了一些繪圖方法。首先導(dǎo)入 import matplotlib.pyplot as plt 這里我們選擇單個站點數(shù)據(jù)進行畫圖: sub = data.loc[:, idx['1001A', :]].xs('1001A', axis=1) 箱線圖 上圖可以看出:不同的要素其值所在范圍是不同的,在探索性分析時應(yīng)分開分析。 除了箱線圖之外,Pandas還可以繪制折線圖,條形圖,餅圖,密度分布等。這在數(shù)據(jù)分析時是比較方便的,但在圖形美化或其他圖形繪制還需要借助其他工具,比如統(tǒng)計繪圖Seaborn更勝一籌??催@里 >>> Python簡單高效的可視化神器——Seaborn 后面會繼續(xù)介紹關(guān)于pandas的更多技巧和高級操作。 數(shù)據(jù): https://pan.baidu.com/s/1whja5oxfMniOGZP3WrBC_A - End - |
|
來自: LibraryPKU > 《科學(xué)計算》