1.pandas的數據結構介紹
a.Series
Series是一種類似於一維數組的對象,它由一組數據以及一組與之相關的數據標籤(即索引)組成。
obj=Series([4,7,-5,3])
print obj
結果爲:
0 4
1 7
2 -5
3 3
dtype: int64
可以通過Series的values和index屬性獲取其數組表示形式和索引對象
print obj.values
print obj.index
結果爲:
[ 4 7 -5 3]
Int64Index([0, 1, 2, 3], dtype='int64')
通常,我們希望所創建的Series帶有一個可以對各個數據點進行標記的索引:
obj2=Series([4,7,-5,3],index=['d','b','a','c'])
print obj2
結果爲:
d 4
b 7
a -5
c 3
dtype: int64
與普通Numpy數組相比,你可以通過索引的方式選取Series中的單個或一組值
print obj2['d']
obj2['c']=10
print obj2[['a','c']]
結果爲:
4
a -5
c 10
dtype: int64
numpy數組運算都會保留索引和值之間的鏈接
print obj2[obj2>0]
print obj2*2
結果爲:
d 4
b 7
c 10
dtype: int64
d 8
b 14
a -10
c 20
dtype: int64
還可以將Series看成是一個定長的有序字典,因爲它是索引值到數據值的一個映射
print 'b' in obj2
print 'e' in obj2
結果爲:
True
False
如果數據被存放在一個Python字典中,也可以直接通過這個字典來創建Series
sdata={'Ohio':35000,'Texas':71000,'Oregon':16000,'Utah':5000}
obj3=Series(sdata)
print obj3
結果爲:
Ohio 35000
Oregon 16000
Texas 71000
Utah 5000
dtype: int64
如果傳入一個字典,則結果Series中的索引就是原字典的鍵(有序排序)
states=['California','Ohio','Oregon','Texas']
obj4=Series(sdata,index=states)
print obj4
結果爲:
California NaN
Ohio 35000
Oregon 16000
Texas 71000
dtype: float64
pandas的isnull和notnull的函數可用於檢測缺失數據
print pd.isnull(obj4)
print pd.notnull(obj4)
結果爲:
California True
Ohio False
Oregon False
Texas False
dtype: bool
California False
Ohio True
Oregon True
Texas True
dtype: bool
Series也有類似的實例方法
print obj4.isnull()
結果爲:
California True
Ohio False
Oregon False
Texas False
dtype: bool
對於許多應用而言,Series最重要的一個功能:它在算術運算中會自動對齊不同索引的數據
print obj3
print obj4
print obj3+obj4
結果爲:
Ohio 35000
Oregon 16000
Texas 71000
Utah 5000
dtype: int64
California NaN
Ohio 35000
Oregon 16000
Texas 71000
dtype: float64
California NaN
Ohio 70000
Oregon 32000
Texas 142000
Utah NaN
dtype: float64
Series對象本身及其索引都有一個name屬性,該屬性跟pandas其他的關鍵功能關係非常密切
obj4.name='population'
obj4.index.name='state'
print obj4
結果爲:
state
California NaN
Ohio 35000
Oregon 16000
Texas 71000
Name: population, dtype: float64
Series的索引可以通過賦值的方式就地修改:
obj.index=['zhuheng','xiaoyang','heng','zhu']
print obj
結果爲:
zhuheng 4
xiaoyang 7
heng -5
zhu 3
dtype: int64
2.DataFrame
DataFrame是一個表格型的數據結構,它含有一組有序的列,每列可以是不同的值類型。DataFrame既有行索引也有列索引,它可以看做由Series組成的字典(共用同一個索引)
data={'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
'year':[2000,2001,2002,2001,2002],
'pop':[1.5,1.7,3.6,2.4,2.9]}
frame=DataFrame(data)
print frame
結果爲:
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
如果指定了順序列,則DataFrame的列就會按照指定順序進行排列
print DataFrame(data,columns=['year','state','pop'])
結果爲:
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
跟Series一樣,如果傳入的列在數據中找不到,就會產生NA值
frame2=DataFrame(data,columns=['year','state','pop','debt'],
index=['one','two','three','four','five'])
print frame2
結果爲:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 NaN
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 NaN
five 2002 Nevada 2.9 NaN
通過類似字典標記的方式或者屬性的方式,可以將DataFrame的列獲取爲一個Series
print frame2['year']
print frame2.state
結果爲:
one 2000
two 2001
three 2002
four 2001
five 2002
Name: year, dtype: int64
one Ohio
two Ohio
three Ohio
four Nevada
five Nevada
Name: state, dtype: object
注意,返回的Series擁有原DataFrame相同的索引,且其name屬性也已經相應的設置好了。行也可以通過位置或名稱的方式進行獲取,比如用索引字段ix
print frame2.ix['three']
結果爲:
year 2002
state Ohio
pop 3.6
debt NaN
Name: three, dtype: object
列可以通過賦值的方式進行修改
frame2['debt']=np.arange(5)
print frame2
結果爲:
year state pop debt
one 2000 Ohio 1.5 0
two 2001 Ohio 1.7 1
three 2002 Ohio 3.6 2
four 2001 Nevada 2.4 3
five 2002 Nevada 2.9 4
如果賦值的是一個Series,就會精確匹配DataFrame的索引,所有的空位都將被填上缺失值
val=Series(['-1.2','-1.5','-1.7'],index=['two','four','five'])
frame2['debt']=val
print frame2
結果爲:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 -1.2
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 -1.5
five 2002 Nevada 2.9 -1.7
爲不存在的列賦值會創建一個新列,關鍵字del用於刪除列
frame2['eastern']=frame2.state=='Ohio'
print frame2
del frame2['eastern']
結果爲:
year state pop debt eastern
one 2000 Ohio 1.5 NaN True
two 2001 Ohio 1.7 -1.2 True
three 2002 Ohio 3.6 NaN True
four 2001 Nevada 2.4 -1.5 False
five 2002 Nevada 2.9 -1.7 False
另一種常見的數據形式是嵌套字典
pop={'Nevada':{2001:2.4,2002:2.9},
'Ohio':{2000:1.5,2001:1.7,2002:3.6}}
frame3=DataFrame(pop)
print frame3
結果爲:
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
可以對該結果進行轉置
print frame3.T
結果爲:
2000 2001 2002
Nevada NaN 2.4 2.9
Ohio 1.5 1.7 3.6
內層字典的鍵會被合併、排序以形成最終的索引。如果顯式指定了索引,則不會這樣
print DataFrame(pop,index=[2001,2002,2003])
結果爲:
Nevada Ohio
2001 2.4 1.7
2002 2.9 3.6
2003 NaN NaN
由Series組成的字典差不多也是一樣的用法
pdata={'Ohio':frame3['Ohio'][:-1],
'Nevada':frame3['Nevada'][:2]}
print DataFrame(pdata)
結果爲:
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
如果設置了DataFrame的index和columns的name屬性,則這些信息也會被顯式出來
frame3.index.name='year'
frame3.columns.name='state'
print frame3
結果爲:
state Nevada Ohio
year
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
跟Series一樣,values屬性也會以二維ndarray的形式返回DataFrame中的數據
print frame3.values
結果爲:
[[ nan 1.5]
[ 2.4 1.7]
[ 2.9 3.6]]