利用python進行數據分析-pandas入門

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]]


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章