[python][科學(xué)計(jì)算][pandas]簡(jiǎn)要使用教程1-數(shù)據(jù)模型與屬性

最后一次更新日期: 2019/3/21

pandas是基于numpy的數(shù)據(jù)分析庫(kù),提供一些更易用的數(shù)據(jù)模型和大量高效的統(tǒng)計(jì)方法。

使用前先導(dǎo)入模塊:
import pandas as pd
按需導(dǎo)入以下模塊:
import numpy as np
import matplotlib.pyplot as plt

1. 索引Index

numpy中只有位置索引,而pandas還增加了標(biāo)簽索引,依賴于一個(gè)專用的Index類型。

常規(guī)索引
In [64]: pd.Index([1,2,3])
Out[64]: Int64Index([1, 2, 3], dtype='int64')

In [65]: pd.Index([1.,2.,3.])
Out[65]: Float64Index([1.0, 2.0, 3.0], dtype='float64')

In [66]: pd.Index(['a','b','c'])
Out[66]: Index(['a', 'b', 'c'], dtype='object')

In [67]: pd.Index(range(10))
Out[67]: RangeIndex(start=0, stop=10, step=1)

In [68]: pd.Index(range(10)).values
Out[68]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int64)

In [80]: import datetime as dt
    ...: dt1=dt.datetime.now()
    ...: dt2=dt1+dt.timedelta(days=1)

In [81]: pd.Index([dt1,dt2])
Out[81]: DatetimeIndex(['2019-03-09 20:56:14.644159', '2019-03-10 20:56:14.644159'], dtype='datetime64[ns]', freq=None)

Index在創(chuàng)建時(shí)會(huì)根據(jù)傳入數(shù)據(jù)(一維序列)自動(dòng)生成具體的索引類型,也可通過dtype參數(shù)指定類型,但無法正常轉(zhuǎn)換時(shí)會(huì)報(bào)錯(cuò);copy參數(shù)指定創(chuàng)建索引時(shí)是否復(fù)制源數(shù)據(jù),默認(rèn)false。
具體的索引類型也可通過各自的方法創(chuàng)建。
Index.values可以查看作為數(shù)據(jù)基礎(chǔ)的一維數(shù)組,Index.dtype可以查看數(shù)據(jù)類型。

多級(jí)索引

pandas提供了多級(jí)索引以便于分組數(shù)據(jù),可用于構(gòu)造高維數(shù)據(jù)集,groupby計(jì)算也會(huì)自動(dòng)產(chǎn)生多級(jí)索引。

In [5]: midx=pd.MultiIndex(levels=[['a','b'],['c','d']],labels=[[1,1,0,0],[0,1,0,1]],name=['idx1','idx2'])

In [6]: midx
Out[6]: 
MultiIndex(levels=[['a', 'b'], ['c', 'd']],
           labels=[[1, 1, 0, 0], [0, 1, 0, 1]],
           names=['idx1', 'idx2'])

In [9]: midx.set_labels([1,0,1,0],level=1)
Out[9]: 
MultiIndex(levels=[['a', 'b'], ['c', 'd']],
           labels=[[1, 1, 0, 0], [1, 0, 1, 0]],
           names=['idx1', 'idx2'])

In [11]: midx.swaplevel(0,1)
Out[11]: 
MultiIndex(levels=[['c', 'd'], ['a', 'b']],
           labels=[[0, 1, 0, 1], [1, 1, 0, 0]],
           names=['idx2', 'idx1'])

In [12]: pd.MultiIndex.from_arrays([['a','a','b','b'],['c','d','c','d']],names=['idx1','idx2'])
Out[12]: 
MultiIndex(levels=[['a', 'b'], ['c', 'd']],
           labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
           names=['idx1', 'idx2'])

MultiIndex的第一個(gè)參數(shù)levels是每個(gè)級(jí)別的唯一標(biāo)簽列表,是一個(gè)兩層嵌套的序列,外層對(duì)應(yīng)級(jí)別,內(nèi)層對(duì)應(yīng)唯一標(biāo)簽;
第二個(gè)參數(shù)labels是所有記錄在每個(gè)級(jí)別上選取的標(biāo)簽序號(hào),也是一個(gè)兩層嵌套的序列,外層對(duì)應(yīng)級(jí)別,內(nèi)層對(duì)應(yīng)記錄,新版本中已被codes參數(shù)取代;
第四個(gè)參數(shù)names是每個(gè)級(jí)別的名稱。

MultiIndex提供了一些輔助方法,set_levels、set_labels、set_names可以設(shè)置整體或是某一級(jí)別的索引屬性,通過level參數(shù)指定級(jí)別,默認(rèn)設(shè)置整體;
swaplevel可以交換級(jí)別,droplevel可以刪除級(jí)別,sortlevel可以對(duì)指定級(jí)別排序;
from_array、from_tuples、from_product、from_frame方法可從其他結(jié)構(gòu)的數(shù)據(jù)中創(chuàng)建索引。

2. 數(shù)據(jù)序列Series

In [99]: s=pd.Series([1,2,3,4],name='s1')

In [100]: s
Out[100]: 
0    1
1    2
2    3
3    4
Name: s1, dtype: int64

In [101]: pd.Series([[1,2],[3,4]],index=['row1','row2'])
Out[101]: 
row1    [1, 2]
row2    [3, 4]
dtype: object

In [102]: s.dtype
Out[102]: dtype('int64')

In [103]: s.name
Out[103]: 's1'

In [104]: s.values
Out[104]: array([1, 2, 3, 4], dtype=int64)

In [105]: s.index
Out[105]: RangeIndex(start=0, stop=4, step=1)

In [106]: s.shape
Out[106]: (4,)

核心數(shù)據(jù)模型其一,由序列名name、標(biāo)簽索引index、值數(shù)組(一維)values組成。用于存放一維數(shù)據(jù),只有一個(gè)軸方向:0,shape屬性可以查看數(shù)據(jù)集的形狀。

創(chuàng)建時(shí)只能接收一維序列數(shù)據(jù)(list,tuple,ndarray),超過一維的將后面的維度看作元素的維度,會(huì)根據(jù)傳入的數(shù)據(jù)自動(dòng)判斷類型,也可通過dtype參數(shù)顯示指定。

默認(rèn)情況下會(huì)生成范圍索引,可通過index參數(shù)指定一個(gè)一維序列作為索引,也可在創(chuàng)建后直接為index屬性賦值。

3. 數(shù)據(jù)框DataFrame

In [107]: df=pd.DataFrame([[1,'a'],[2,'b']],columns=['col1','col2'])

In [108]: df
Out[108]: 
   col1 col2
0     1    a
1     2    b

In [113]: df.dtypes
Out[113]: 
col1     int64
col2    object
dtype: object

In [114]: df.index
Out[114]: Int64Index([1, 2], dtype='int64', name='col1')

In [116]: df.columns
Out[116]: Index(['col1', 'col2'], dtype='object')

In [117]: df.values
Out[117]: 
array([[1, 'a'],
       [2, 'b']], dtype=object)

In [125]: df.col2
Out[125]: 
col1
1    a
2    b
Name: col2, dtype: object

In [126]: pd.DataFrame({'col1':[1,3],'col2':['a','b']})
Out[126]: 
   col1 col2
0     1    a
1     3    b

In [127]: df.shape
Out[127]: (2, 2)

核心數(shù)據(jù)模型其二,也就是數(shù)據(jù)表,由列標(biāo)簽索引columns、行標(biāo)簽索引index、值數(shù)組(二維)values組成。用于存放二維數(shù)據(jù),有兩個(gè)軸方向:0和1,對(duì)應(yīng)行坐標(biāo)和列坐標(biāo),shape屬性可以查看數(shù)據(jù)集的形狀。列數(shù)據(jù)的訪問可以通過與列名相同的屬性名訪問,僅在定義了字符串列名時(shí)可用,一個(gè)單列即是一個(gè)Series。

創(chuàng)建時(shí)只能接收二維序列數(shù)據(jù)(list,tuple,ndarray),超過二維的將后面的維度看作元素的維度,會(huì)根據(jù)傳入的數(shù)據(jù)自動(dòng)判斷類型,也可通過dtype參數(shù)顯示指定,與numpy不太一樣的是,DataFrame的列可以定義不同的數(shù)據(jù)類型,通過創(chuàng)建時(shí)的自動(dòng)判斷,或是篩選出列后轉(zhuǎn)換類型,DataFrame.dtypes屬性可查看所有列的數(shù)據(jù)類型。相比numpy,pandas的DataFrame創(chuàng)建還增加了對(duì)dict數(shù)據(jù)源的支持,key對(duì)應(yīng)列名,value對(duì)應(yīng)列數(shù)據(jù)。

默認(rèn)情況下會(huì)生成范圍索引,可通過index參數(shù)指定一個(gè)一維序列作為索引,也可在創(chuàng)建后直接為index屬性賦值,DataFrame.set_index方法可以返回替換了索引的數(shù)據(jù)框副本而不影響原數(shù)據(jù)。

DataFrame相當(dāng)于Series的堆疊,沿DataFrame的行或列方向進(jìn)行寬度為1的切片,得到的就是一個(gè)Series

原本pandas還提供了三維的數(shù)據(jù)模型Panel,但新版中已經(jīng)廢棄,可嘗試使用多級(jí)索引MultiIndex來構(gòu)造更高維度的數(shù)據(jù)集。

4. 分類數(shù)據(jù)Categorical

pandas提供了分類數(shù)據(jù)類型用于約束此類數(shù)據(jù),該類型會(huì)限制分類標(biāo)簽的取值,并可為分類標(biāo)簽提供排序依據(jù)。

In[14]: pd.Categorical(['a','b','b','c'],categories=['a','b'],ordered=True)
Out[14]: 
[a, b, b, NaN]
Categories (2, object): [a < b]

In[15]: pd.Categorical(['a','b','b','c'])
Out[15]: 
[a, b, b, c]
Categories (3, object): [a, b, c]

第一個(gè)參數(shù)values為所有分類標(biāo)簽的序列;
第二個(gè)參數(shù)categories為唯一分類標(biāo)簽的序列,當(dāng)指定該參數(shù)后,values中不屬于categories的標(biāo)簽會(huì)被替換為NaN,不指定時(shí)會(huì)根據(jù)values自動(dòng)生成;
第三個(gè)參數(shù)ordered聲明唯一分類標(biāo)簽是否指示排序方式,為True時(shí)會(huì)按categories中的順序?qū)?biāo)簽標(biāo)定大小關(guān)系,默認(rèn)False

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容