pandas包含數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)操作工具,可用于進(jìn)行數(shù)據(jù)清理和快速分析。pandas經(jīng)常和數(shù)字計(jì)算工具(比如NumPy和SciPy)一起使用分析文庫,或者與matplotlib一起使用進(jìn)行數(shù)據(jù)的可視化。pandas采用NumPy的基于數(shù)組計(jì)算的部分慣用風(fēng)格,特別是基于數(shù)組的計(jì)算函數(shù)和不帶for循環(huán)的數(shù)據(jù)處理剥槐。雖然pandas采用了許多來自NumPy的編碼習(xí)慣用法,但最大的區(qū)別在于pandas是為處理表格或異質(zhì)性(heterogeneous)數(shù)據(jù)而設(shè)計(jì)的宪摧。相反粒竖,NumPy適合處理均一的(homogeneous)數(shù)值陣列數(shù)據(jù)。
使用下面代碼調(diào)用pandas:
import pandas as pd
所以几于,如果你看到了有pd.**
這樣的代碼蕊苗,就說明是pandas的功能。
有關(guān)于pandas的數(shù)據(jù)結(jié)構(gòu)沿彭,你需要了解兩種主要的數(shù)據(jù)結(jié)構(gòu):Series 和 DataFrame朽砰。雖然這兩個(gè)數(shù)據(jù)結(jié)構(gòu)不能解決所有的問題,但是卻可以提供一個(gè)堅(jiān)實(shí)的喉刘、易于使用的應(yīng)用基礎(chǔ)瞧柔。
Series
Series是一個(gè)一維的、類似數(shù)組的對(duì)象睦裳,它包含一系列的值造锅,和一個(gè)相關(guān)數(shù)組(數(shù)據(jù)標(biāo)簽),也叫做索引(index)廉邑。最簡單的Series是由一個(gè)數(shù)組組成的數(shù)據(jù):
In [1]: import pandas as pd
In [2]: obj = pd.Series([4, 7, -5, 3])
In [3]: obj
Out[3]:
0 4
1 7
2 -5
3 3
dtype: int64
In [4]: obj.values
Out[4]: array([ 4, 7, -5, 3])
In [5]: obj.index
Out[5]: RangeIndex(start=0, stop=4, step=1)
因?yàn)樯厦嫖覀儾]有為數(shù)據(jù)指定索引哥蔚,所以默認(rèn)的索引就是從0開始的整數(shù)倒谷,當(dāng)然你可以自定義數(shù)據(jù)的索引:
In [6]: obj2 = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
In [7]: obj2
Out[7]:
d 4
b 7
a -5
c 3
dtype: int64
In [8]: obj2.index
Out[8]: Index(['d', 'b', 'a', 'c'], dtype='object')
篩選大于0的元素以及其對(duì)應(yīng)的索引:
In [9]: obj2[obj2>0]
Out[9]:
d 4
b 7
c 3
dtype: int64
對(duì)Series進(jìn)行計(jì)算:
In [10]: obj2 * 2
Out[10]:
d 8
b 14
a -10
c 6
dtype: int64
如果你的data是一個(gè)python dict,也可以通過dict構(gòu)建一個(gè)Series:
In [11]: sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
In [12]: obj3 = pd.Series(sdata)
In [13]: obj3
Out[13]:
Ohio 35000
Texas 71000
Oregon 16000
Utah 5000
dtype: int64
你也可以從Series里提取出指定的索引以及其對(duì)應(yīng)的內(nèi)容:
In [15]: states = ['California', 'Ohio', 'Oregon', 'Texas']
In [16]: obj4 = pd.Series(sdata,index=states)
In [17]: obj4
Out[17]:
California NaN #這里顯示的是NaN肺素,是因?yàn)樵趏bj3里并沒有索引為“California”的內(nèi)容
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
dtype: float64
將兩個(gè)Seires相加:
In [18]: obj3 + obj4
Out[18]:
California NaN #只有obj4里有California這個(gè)索引
Ohio 70000.0
Oregon 32000.0
Texas 142000.0
Utah NaN #只有obj3里有Utah這個(gè)索引恨锚,所以任何數(shù)和NaN相加都是NaN
dtype: float64
給對(duì)象命名宇驾,并且給索引這一列加一個(gè)列名:
In [19]: obj4.name = 'population'
In [20]: obj4.index.name = 'state'
In [21]: obj4
Out[21]:
state
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
Name: population, dtype: float64
DataFrame
DataFrame對(duì)于很多分析過生信的人來說并不陌生倍靡,它是一個(gè)table,包含行和列课舍,行和列有各自的數(shù)據(jù)類型(數(shù)字塌西,字符串等等)。這里的DataFrame有行索引和列索引筝尾,你可以把它看成一個(gè)具有相同索引的Series字典捡需。數(shù)據(jù)被存儲(chǔ)在一個(gè)或更多的二維模塊里,而不是列表筹淫、字典或其他一些一維數(shù)組里站辉。
有很多種方法可以構(gòu)建DataFrame
(1)最常用的方法是利用等長的list組成的字典或者Numpy array來構(gòu)建DataFrame:
In [23]: data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
...: 'year': [2000, 2001, 2002, 2001, 2002, 2003],
...: 'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
In [24]: frame = pd.DataFrame(data)
In [25]: frame
Out[25]:
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 2.4
4 Nevada 2002 2.9
5 Nevada 2003 3.2
如果這里你用的是jupyter notebook的web界面,輸出的DataFrame會(huì)更好看一些:
查看DataFrame的前5列:
In [26]: frame.head()
Out[26]:
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 2.4
4 Nevada 2002 2.9
修改你的DataFrame的列名:
In [27]: pd.DataFrame(data, columns=['year', 'state', 'pop'])
Out[27]:
year state pop
0 2000 Ohio 1.5
1 2001 Ohio 1.7
2 2002 Ohio 3.6
3 2001 Nevada 2.4
4 2002 Nevada 2.9
5 2003 Nevada 3.2
提取DataFrame里的某一列:
In [28]: frame['state']
Out[28]:
0 Ohio
1 Ohio
2 Ohio
3 Nevada
4 Nevada
5 Nevada
Name: state, dtype: object
In [29]: frame['year']
Out[29]:
0 2000
1 2001
2 2002
3 2001
4 2002
5 2003
Name: year, dtype: int64
提取DateFrame里的行:
In [6]: frame.loc[frame['state']=='Ohio'] #提取state一列里是Ohio的行
Out[6]:
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
給DataFrame加一列:
In [13]: frame['eastern'] = frame.state == 'Ohio'
In [14]: frame
Out[14]:
state year pop eastern
0 Ohio 2000 1.5 True
1 Ohio 2001 1.7 True
2 Ohio 2002 3.6 True
3 Nevada 2001 2.4 False
4 Nevada 2002 2.9 False
5 Nevada 2003 3.2 False
刪除一列:
In [16]: del frame['eastern']
In [17]: frame
Out[17]:
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 2.4
4 Nevada 2002 2.9
5 Nevada 2003 3.2
顯示列名:
In [18]: frame.columns
Out[18]: Index(['state', 'year', 'pop'], dtype='object')
(2)利用嵌套字典構(gòu)建DataFrame
In [19]: pop = {'Nevada': {2001: 2.4, 2002: 2.9},
...: 'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
In [20]: frame3 = pd.DataFrame(pop)
In [21]: frame3
Out[21]:
Nevada Ohio
2001 2.4 1.7
2002 2.9 3.6
2000 NaN 1.5
DataFrame轉(zhuǎn)置:
In [22]: frame3.T
Out[22]:
2001 2002 2000
Nevada 2.4 2.9 NaN
Ohio 1.7 3.6 1.5
根據(jù)索引提取內(nèi)容:
In [23]: pd.DataFrame(pop, index=[2001, 2002, 2003])
Out[23]:
Nevada Ohio
2001 2.4 1.7
2002 2.9 3.6
2003 NaN NaN #原dataFrame里沒有2003這個(gè)索引损姜,所以結(jié)果這里是NaN
給索引列和列名分別起名字:
In [24]: frame3.index.name = 'year'; frame3.columns.name = 'state'
In [25]: frame3
Out[25]:
state Nevada Ohio
year
2001 2.4 1.7
2002 2.9 3.6
2000 NaN 1.5