[python][科學計算][pandas]簡要使用教程1-數據模型與屬性

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

pandas是基于numpy的數據分析庫,提供一些更易用的數據模型和大量高效的統計方法。

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

1. 索引Index

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

常規索引
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在創建時會根據傳入數據(一維序列)自動生成具體的索引類型,也可通過dtype參數指定類型,但無法正常轉換時會報錯;copy參數指定創建索引時是否復制源數據,默認false
具體的索引類型也可通過各自的方法創建。
Index.values可以查看作為數據基礎的一維數組,Index.dtype可以查看數據類型。

多級索引

pandas提供了多級索引以便于分組數據,可用于構造高維數據集,groupby計算也會自動產生多級索引。

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的第一個參數levels是每個級別的唯一標簽列表,是一個兩層嵌套的序列,外層對應級別,內層對應唯一標簽;
第二個參數labels是所有記錄在每個級別上選取的標簽序號,也是一個兩層嵌套的序列,外層對應級別,內層對應記錄,新版本中已被codes參數取代;
第四個參數names是每個級別的名稱。

MultiIndex提供了一些輔助方法,set_levelsset_labelsset_names可以設置整體或是某一級別的索引屬性,通過level參數指定級別,默認設置整體;
swaplevel可以交換級別,droplevel可以刪除級別,sortlevel可以對指定級別排序;
from_arrayfrom_tuplesfrom_productfrom_frame方法可從其他結構的數據中創建索引。

2. 數據序列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,)

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

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

默認情況下會生成范圍索引,可通過index參數指定一個一維序列作為索引,也可在創建后直接為index屬性賦值。

3. 數據框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)

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

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

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

DataFrame相當于Series的堆疊,沿DataFrame的行或列方向進行寬度為1的切片,得到的就是一個Series

原本pandas還提供了三維的數據模型Panel,但新版中已經廢棄,可嘗試使用多級索引MultiIndex來構造更高維度的數據集。

4. 分類數據Categorical

pandas提供了分類數據類型用于約束此類數據,該類型會限制分類標簽的取值,并可為分類標簽提供排序依據。

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]

第一個參數values為所有分類標簽的序列;
第二個參數categories為唯一分類標簽的序列,當指定該參數后,values中不屬于categories的標簽會被替換為NaN,不指定時會根據values自動生成;
第三個參數ordered聲明唯一分類標簽是否指示排序方式,為True時會按categories中的順序對標簽標定大小關系,默認False

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容