歡迎來(lái)我的個(gè)人博客:fizzyi
Pandas介紹
查看pandas版本
import pandas as pd
pd.__version__
pandas主要的兩個(gè)數(shù)據(jù)結(jié)構(gòu)是Series
和DataFrame
導(dǎo)入模塊
import numpy as np
from pandas import Series,DataFrame
Pandas數(shù)據(jù)結(jié)果: Series
從一般意義上來(lái)講,Series可以簡(jiǎn)單的被認(rèn)為是一維的數(shù)組吠式。Series和一維數(shù)組最主要的區(qū)別在與Series類(lèi)型具有索引(index),可以和另一個(gè)編程中最常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)哈希聯(lián)系起來(lái)陡厘。
創(chuàng)建Series
創(chuàng)建一個(gè)Series的基本格式是s = Series(data,index=index,name=name)
。首先我們從數(shù)組創(chuàng)建Series:
a = np.random.randn(5)
print(a)
s = Series(a)
print(s)
[-1.24962807 -0.85316907 0.13032511 -0.19088881 0.40475505]
0 -1.249628
1 -0.853169
2 0.130325
3 -0.190889
4 0.404755
可以在創(chuàng)建Series時(shí)添加index,并可使用Series.inde查看具體的index特占。但是需要注意的一點(diǎn)是糙置,當(dāng)從數(shù)組創(chuàng)建Series時(shí),若指定index,那么index長(zhǎng)度和data的長(zhǎng)度一致是目。
s = Series(np.random.randn(5),index=['a','b','c','d','e'])
print(s)
a 0.509906
b -0.764549
c 0.919338
d -0.084712
e 1.896407
創(chuàng)建Series的另一個(gè)可選項(xiàng)是name谤饭,可指定Series的名稱(chēng),可以用Series.name訪(fǎng)問(wèn)懊纳。
Series還可以從字典創(chuàng)建揉抵。
d = {'a':0,'b':1,'c':2}
print(d)
s = Series(d)
print s
{'a': 0.0, 'c': 2, 'b': 1}
a 0
b 1
c 2
使用字典創(chuàng)建Series時(shí)指定index的情形(index長(zhǎng)度不必和字典相同,如果多了的話(huà)嗤疯,pandas將會(huì)自動(dòng)為多余的index分配N(xiāo)aN)
字典創(chuàng)建的Series冤今,數(shù)據(jù)將按index的順序重新排列。
Series(4,index=['a','b','c','d'])
a 4
b 4
c 4
d 4
e 4
如果數(shù)據(jù)就是一個(gè)單一的變量茂缚,如數(shù)字4戏罢,那么Series將重復(fù)這個(gè)變量屋谭。
Series 數(shù)據(jù)的訪(fǎng)問(wèn)
訪(fǎng)問(wèn)Series數(shù)據(jù)可以和數(shù)組一樣使用下標(biāo),也可以像字典一樣使用索引龟糕,還可以使用一些條件過(guò)濾桐磁。
s = Series(np.random.randn(10),index=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'])
s[0] #取第一位
s[:2] #取0,1
s[[2,0,4]] #取2讲岁,0我擂,4位
s[['e','i']] #取index為e 和 i的
s[s > 0.5] #取值大于0.5的
'e' in s #判斷s中有沒(méi)有下標(biāo)e
Pandas數(shù)據(jù)結(jié)構(gòu):DataFrame
DataFrame
是將多個(gè)Series
按列合并而成的二維數(shù)據(jù)結(jié)構(gòu),每個(gè)列單獨(dú)取出來(lái)是一個(gè)Series
催首,和SQL數(shù)據(jù)庫(kù)中取出的數(shù)據(jù)是類(lèi)似的扶踊。DataFrame
的優(yōu)勢(shì)在于可以方便的處理不同類(lèi)型的列。
創(chuàng)建DataFrame
方法一
從字典創(chuàng)建DataFrame
郎任。DataFrame
是一個(gè)二維的數(shù)據(jù)結(jié)果秧耗,是多個(gè)Series
的集合體。先創(chuàng)建一個(gè)值是Series
的字典舶治,然后轉(zhuǎn)換為DataFrame
d = {'one':Series([1.,2.,3.,],index=['a','b','c']),'two':Series([1.,2.,3.,4.],index=['a','b','c','d'])}
df = DataFrame(d)
print df
one two
a 1 1
b 2 2
c 3 3
d NaN 4
可以指定所需的行和列分井,若字典中不含有對(duì)應(yīng)的元素,則為NaN
df = DataFrame(d,index=['r','d','a'],columns=['two','three'])
print df
two three
r NaN NaN
d 4 NaN
a 1 NaN
-
dataframe.index
和dataframe.columns
查看DataFrame
的行和列 -
dataframe.values
則以數(shù)組的形式返回dataframe的元素
方法二
DataFrame
也可以從值是數(shù)組的字典中創(chuàng)建霉猛,但是各個(gè)數(shù)組的長(zhǎng)度需要相同
d = {'one':[1,2,3,4],'tow':[4,3,2,1]}
df = DataFrame(d,index=['a','b','c','d'])
print df
one two
a 1 4
b 2 3
c 3 2
d 4 1
值如果不是數(shù)組尺锚,沒(méi)有這一限制,并且缺失值補(bǔ)成NaN
如果需要?jiǎng)?chuàng)建一個(gè)空的DataFrame
df = DataFrame()
方法三
使用concat
函數(shù)基于Series
或者DataFrame
創(chuàng)建一個(gè)DataFrame
a = Series(range(5))
b = Series(np.linspace(4,20,5))
df = pd.concat([a,b],axis=1)
print df
0 1
0 0 4
1 1 8
2 2 12
3 3 16
4 4 20
其中axis=1表示按列合并惜浅,axis=0表示按行合并瘫辩。
df = DataFrame()
index = ['alpha','beta','gamma','delta','eta']
for i in range(5):
a = DataFrame([np.linspace(i,5*i,5)],index=[index[i]])
df = pd.concat([df,a],axis=0)
print df
0 1 2 3 4
alpha 0 0 0 0 0
beta 1 2 3 4 5
gamma 2 4 6 8 10
delta 3 6 9 12 15
eta 4 8 12 16 20
DataFrame
數(shù)據(jù)的訪(fǎng)問(wèn)
因?yàn)?code>DataFrame是以列作為操作的基礎(chǔ)的,所以全部的操作都可以想象成先從DataFrame里取出來(lái)一列坛悉,再?gòu)倪@個(gè)series中取元素即可伐厌。
-
datafrae.column_name
只能選取一列 有列名,必須使用列名選取裸影,在沒(méi)有列名的時(shí)候是無(wú)效的挣轨。 -
dataframe[]
可以選擇多列 無(wú)列名 使用下標(biāo)選取列
df.columns = ['a','b','c','d','e']
使用dataframe.columns為dataframe賦列名
從dataframe中單獨(dú)取一列出來(lái),其數(shù)據(jù)結(jié)構(gòu)顯示的是series轩猩,取兩列及以上的結(jié)果仍然是dataframe卷扮。訪(fǎng)問(wèn)特定的元素可以如series一樣使用下標(biāo)或者是索引。
若需要選取行均践,可以使用dataframe.iloc按下標(biāo)選取晤锹,或者使用dataframe.loc按索引選取。
print(df.iloc[1])
print(df.loc['beta'])
選取行還可以使用切片的方式或者是布爾類(lèi)型的向量
print(df[1:3])
bool_vec = [True,False,True,True,False]
print(df[bool_vec])
行列組合起來(lái)選取數(shù)據(jù)
print(df[['b','d']].iloc[[1,3]])
print(df.iloc[[1,3]][['b','d']])
print(df[['b','d']].loc[['beta','delta']])
print(df.loc[['beta','delta']][['b','d']])
如果只是某個(gè)特殊位置的元素的話(huà)彤委,dataframe.at 和dataframe.iat是最快的方式鞭铆,它們分別用于使用索引和下標(biāo)進(jìn)行訪(fǎng)問(wèn)。
print(df.iat[2,3])
print(df.at['gamma','d'])
dataframe.ix可以混合使用索引和下標(biāo)進(jìn)行訪(fǎng)問(wèn)葫慎,唯一需要注意的地方是行列內(nèi)部需要一致衔彻,不可以同時(shí)使用索引和下標(biāo)訪(fǎng)問(wèn)行或者列。
print(df.ix['gamma',4])
print(df.ix[['delta','gamma'],[1,4]])
print(df.ix[[1,2],['b','e']])
#錯(cuò)誤的寫(xiě)法
print(df.ix[['beta',2],['be','e']])
print(df.ix[[1,2],['b',4]])