Pandas
pandas是一款資料處理工具,集成了numpy以及matplotlib,擁有便捷的資料處理以及檔案讀取能力
核心資料結構
1. DataFrame
numpy僅用作計算,在資料表示方面還有所欠缺,很難從資料上面看出資訊表達的含義,在這裡我們可以將DataFrame看作是有行列索引(標題)的二維陣列
I. DataFrame屬性
pd.DataFrame(array, index,columns)
因為pandas是集成了numpy的,屬性方面用法和功能都類似
- shape(形狀)
- values(除去行列索引後的值)
- T(行列轉置)
- index(行索引)
- columns(列索引)
II. 方法
- head(size)——顯示前size行資料,預設前五行
- tail(size)——顯示後size行資料,預設後五行
import pandas as pd #二維陣列定義 s = [[10,20],[20,30],[30,40]] #行索引定義 row = ["test{}".format(i+1) for i in range(3)] #列索引定義 col = ["2019-3-{}".format(i+1) for i in range(2)] data = pd.DataFrame(s, index=row, columns=col) #輸出 2019-3-12019-3-2 test11020 test22030 test33040
III.設定索引
- 修改行列索引值
只能整體修改,不能修改單獨某一項
- 重設索引
reset_index(drop=False)
重置索引值,預設drop為False,不刪除原索引,將其單獨立為一列,在此基礎上將索引重置
-
設定新的索引 __
set_index(keys, drop=True)__
- keys: 列索引名稱或者列索引名稱的列表
- drop: boolean,預設為True,當做新的索引,刪除原來的列
#設定多個索引 df = pd.DataFrame({'month':[1,4,7,10],'year':[2012,2014,2013,2016],'sale':[55,40,84,31]}) df.set_index(['year', 'month'])#設定之後此時返回的index是MultiIndex型別 #輸出 sale year month 2012 155 2014 440 2013 784 2016 1031 >>>
IV. MultiIndex
多級或分層索引物件,可用於存放三維資料
- index屬性
- names:levels的名稱
- levels:每個level的元組值
new_df = df.set_index(['year', 'month']) new_df.index new_df.index.names new_df.index.levels #輸出 ----------------------index-------------------------------------------- MultiIndex(levels=[[2012, 2013, 2014, 2016], [1, 4, 7, 10]], labels=[[0, 2, 1, 3], [0, 1, 2, 3]], names=['year', 'month']) ---------------------------------------------------------------------------------- ----------------------names-------------------------------------------- FrozenList(['year', 'month']) ---------------------------------------------------------------------------------- ----------------------levels-------------------------------------------- FrozenList([[2012, 2013, 2014, 2016], [1, 4, 7, 10]])
2. Panel
存放三維資料的面板容器,0.20.0後已經棄用,推薦DataFrame上的MultiIndex方法表示3D資料
I.維度
- items => axis0,每個專案對應內部包含的資料幀(DataFrame)
- major_axis => axis 1,它是每個資料幀(DataFrame)的索引(行)
- minor_axis => axis 2, 它是每個資料幀(DataFrame)的列
3. Series
可理解為帶索引的一維陣列
I. 屬性
- index —— 索引項
- values ——索引值,numpy.ndarray型別
II. 建立Series
- 通過已有資料建立
指定內容,預設索引
pd.Series(np.arange(10)) #輸出 00 11 22 33 44 55 66 77 88 99
指定索引
pd.Series([6.7,5.6,3,10,2],index=[1,2,3,4,5]) #輸出 16.7 25.6 33.0 410.0 52.0 dtype: float64
- 通過字典資料建立
pd.Series({'red':1000,'blue':100,'green':500,'yellow':200}) #輸出 red1000 blue100 green500 yellow200 dtype: int64
III. 索引操作
data = pd.readcsv('filename.csv')
1) 直接索引
必須滿足先列後行的規則, data[col][row]
2) 按名字索引
new_data = data.locp[索引名,索引名]
或者 new_data = data.locp[索引名][索引名]
3) 直接按照數字索引
data.iloc[number,number]
4) IX組合索引(數字和名字組合)
data.ix[parm,parm]
- 在進行索引操作的時候,可以結合前面的
index
以及columns.get_indexer
等方法進行資料的獲取
IV. 賦值
按照上述索引方法找到對應資料進行賦值即可
V. 排序
1)按照內容排序
sort_values(by=,ascendinf=)
- by: 排序關鍵字,可指定單鍵或者多建(以列表形式賦給by即可)
- ascending: 預設升序,False則降序
2)按照索引排序
sort_index()
- 排序方法對DataFrame以及Series都是適用的,前者需要指定關鍵字,但是Series的一維資料只需要直接呼叫方法執行即可。
VI. DataFrame運算
1) 算術運算
可以直接用運算子(+、-、*等)或者相應的運算方法(add()、sub()等),作用於資料裡面的所有元素
2) 邏輯運算
-
邏輯運算子
> (大於) 、 < (小於) 、 &(並且) 、 |(或者)
返回 帶索引的布林值 ,可以用相應的索引方法篩選資料,例如
data[data['parm']>2]
,在使用&的時候要注意優先順序,不確定的可以用括號包裹 -
邏輯運算函式
- query(expr) —— 按照expr字串條件查詢
- isin(values) —— 判斷是否含有values數值,有則返回True,否則返回False
V. 統計運算
max、mean、median、var、std等
,此外可以使用describe()方法統一進行運算,它會自動統計出一些常用運算結果(包含以上內容)

count.png
- 這裡的idxmax就是類似之前numpy裡面的argmax方法獲取最大值的位置
VI. 自定義運算
如果需要額外的運算規則,可以自定義一個函式進行統計
apply(func, axis=0)
- func: 自定義函式
- axis: 預設為0,計算列,axis=1時對行運算
#自定義一個對列資料最大值減最小值的運算函式 data.apply(lambda x : x.max()-x.min(), axis=0)
pandas畫圖

image.png
檔案讀取與儲存

image.png
1. csv操作
I. 讀取csv
pandas.read_csv(filepath_or_buffer, sep=',', delimiter=None, names=, usecols=)
- filepath_or_buffer:檔案路徑
- usecols:指定讀取的列名,列表形式,用作篩選所需要的資料,也可以通過drop函式剔除資料
- names:如果遇到直接就是資料的檔案,需要通過names引數手動填入索引項
II. 寫入csv
DataFrame.to_csv(path_or_buf=None, sep=',', columns=None, header=True, index=True, index_label=None,mode='w', encoding=None)
- path_or_buf:檔案路徑
- sep:分隔符
- columns:要儲存的列,列表形式
- header:預設為True,是否寫進列索引值
- index:是否寫進行索引值
- mode:w為重寫,a為追加
- series和dataframe操作基本一致
2. HDF5操作
HDF5的儲存支援壓縮,使用的方式是blosc,速度最快也是pandas預設支援的,可以提高磁碟利用率,節省空間的同時還支援跨平臺,可以輕鬆遷移到hadoop上面,HDF5檔案的讀取和儲存需要指定一個鍵,值為要儲存的DataFrame,一個鍵對應一個DataFrame,也可以相當於是儲存三維資料了
I.讀取hdf5
讀取以及寫入需要指定鍵,不同的鍵對應不同的DataFrame
pandas.read_hdf(path_or_buf, key=None, **kwargs)
- key: 讀取的鍵
- mode: 開啟檔案的方式
II. 寫入hdf5檔案
可以寫入同一個hdf5檔案當中,以不同的鍵區分開來
DataFrame.to_hdf(path_or_buf, key, kwargs)
3. JSON檔案操作
I. 讀取
pandas.read_json(path_or_buf=None,orient=None,typ='frame',lines=False)
- orient: 指定格式,以下為引數值
- split
- records(最常用的格式,其他了解即可)
- index
- columns
- values
- lines: 是否逐行讀取,預設為False
- typ: 指定轉換成的物件型別,series或者dataframe,預設為frame
2. 寫入
pandas.to_json(path_or_buf=None,orient=None,typ='frame',lines=False)