1. 程式人生 > >pandas入門練習-資料結構

pandas入門練習-資料結構

pandas 是python的一個數據分析包,是基於NumPy 的一種工具,該工具是為了解決資料分析任務而建立的。提供了高效地操作大型資料集所需的工具,使得資料分析工作變著簡單高效。

pandas資料結構介紹

Series是一種類似於一維陣列的物件,它由一維組數(各種Numpy資料型別)以及一組與之相關的資料標籤(即索引)組成。僅由一組資料即可產生最簡單的Series

from pandas import Series,DataFrame
import pandas as pd
import numpy as np
obj=Series([4,7,-5,3])
obj
0    4
1    7
2   -5
3    3
dtype: int64

Series的字串表現形式是:索引在左邊,值在右邊,由於沒有為資料指定索引,就會自動建立一個0到N-1的整數型索引。可以通過Series的values和index屬性獲取其陣列表示形式和索引物件。

obj.values

    array([ 4,  7, -5,  3], dtype=int64)
obj.index
    RangeIndex(start=0, stop=4, step=1)
我們希望建立的Series帶有一個可以對各個資料點進行標記的索引
obj2=Series([4,7,-5,3],index=['d'
,'b','a','c']) obj2
    d    4
    b    7
    a   -5
    c    3
    dtype: int64
obj2.index
    Index(['d', 'b', 'a', 'c'], dtype='object')
通過索引的方式選取Series中的一個或者一組值
obj2['a']
    -5
obj2['d']=6
obj2[['c','a','d']]
    c    3
    a   -5
d 6 dtype: int64
Numpy陣列運算(如根據布林型陣列進行過濾、標量乘法、應用數學函式等)都會保留索引和值之間的連線。
obj2
    d    6
    b    7
    a   -5
    c    3
    dtype: int64
obj2[obj2>0]
    d    6
    b    7
    c    3
    dtype: int64
obj2*2
    d    12
    b    14
    a   -10
    c     6
    dtype: int64
np.exp(obj2)
    d     403.428793
    b    1096.633158
    a       0.006738
    c      20.085537
    dtype: float64
可以將Series看成是一個定長的有序字典,因為它是索引值到資料值的一個對映。可以用在許多原本需要字典引數的函式中。
'b' in obj2
    True
'k' in obj2
    False
如果資料被存放在一個python字典中,通過這個字典來建立Series
sdata={'Ohio':35000,'Texas':71000,'Oregon':16000,'Utah':5000}
obj3=Series(sdata)
obj3
    Ohio      35000
    Oregon    16000
    Texas     71000
    Utah       5000
    dtype: int64
states=['California','Ohio','Oregon','Texas']
obj4=Series(sdata,index=states)
obj4
    California        NaN
    Ohio          35000.0
    Oregon        16000.0
    Texas         71000.0
    dtype: float64
pandas的isnull和notnull函式可用於檢測缺失資料
pd.isnull(obj4)
    California     True
    Ohio          False
    Oregon        False
    Texas         False
    dtype: bool
pd.notnull(obj4)
    California    False
    Ohio           True
    Oregon         True
    Texas          True
    dtype: bool
obj4.isnull()

    California     True
    Ohio          False
    Oregon        False
    Texas         False
    dtype: bool
在算術運算中會自動對齊不同索引的資料
obj3
    Ohio      35000
    Oregon    16000
    Texas     71000
    Utah       5000
    dtype: int64
obj4
    California        NaN
    Ohio          35000.0
    Oregon        16000.0
    Texas         71000.0
    dtype: float64
obj3+obj4
    California         NaN
    Ohio           70000.0
    Oregon         32000.0
    Texas         142000.0
    Utah               NaN
    dtype: float64
Series物件本身及其索引都有一個name屬性,該屬性跟padans其他的關鍵功能關係很密切
obj4.name='population'
obj4.index.name='state'
obj4
    state
    California        NaN
    Ohio          35000.0
    Oregon        16000.0
    Texas         71000.0
    Name: population, dtype: float64
Series的索引可通過賦值的方式修改
obj.index=['Bob','Steve','Jeff','Ryan']
obj
    Bob      4
    Steve    7
    Jeff    -5
    Ryan     3
    dtype: int64
###DataFrame表格型資料結構 DataFrame含有一組有序的列,每列可以是不同的值型別(數值、字串、布林型等),有行索引也有列索引,可以看作是由Series組成的字典(共同用一個索引)。DataFrame中面向行和麵向列的基本操作是平衡的。DataFrame中的資料是以一個或多個二維存放的(而不是列表、字典或別的一維資料結構) 構建DataFrame的辦法很多種,最常用的一種是傳入一個由等長列表或者Numpy陣列組成的字典。
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)
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會自動加上索引(跟Series一樣),且全部列會被有序排列。

DataFrame的列會按照指定的列序指定順序進行排列

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'])
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
frame2['state']
    one        Ohio
    two        Ohio
    three      Ohio
    four     Nevada
    five     Nevada
    Name: state, dtype: object
frame2.year
    one      2000
    two      2001
    three    2002
    four     2001
    five     2002
    Name: year, dtype: int64
frame2.ix['three']
    year     2002
    state    Ohio
    pop       3.6
    debt      NaN
    Name: three, dtype: object
列可以通過賦值的方式修改
frame2['debt']=16.5
frame2
year state pop debt
one 2000 Ohio 1.5 16.5
two 2001 Ohio 1.7 16.5
three 2002 Ohio 3.6 16.5
four 2001 Nevada 2.4 16.5
five 2002 Nevada 2.9 16.5
frame2['debt']=np.arange(5.)
frame2
year state pop debt
one 2000 Ohio 1.5 0.0
two 2001 Ohio 1.7 1.0
three 2002 Ohio 3.6 2.0
four 2001 Nevada 2.4 3.0
five 2002 Nevada 2.9 4.0

將陣列或者列表賦值給某個列時,其長度需要跟DataFrame的長度相匹配,如果賦值的是一個Series,就會精確匹配DataFrame的索引,所有的空位都會填寫上缺失值。

val=Series([-1.2,-1.5,-1.7],index=['two','four','five'])
frame2['debt']=val
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'
frame2
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
del frame2['eastern']
frame2.columns
    Index(['year', 'state', 'pop', 'debt'], dtype='object')
巢狀字典,外層字典的鍵作為列,內層鍵作為行索引
pop={'Nevada':{2001:2.4,2002:2.9},
    ....:'Ohio':{2000:1.5,2001:107,2002:3.6}}
frame3=DataFrame(pop)
frame3
Nevada Ohio
2000 NaN 1.5
2001 2.4 107.0
2002 2.9 3.6

對結果進行轉置

frame3.T
2000 2001 2002
Nevada NaN 2.4 2.9
Ohio 1.5 107.0 3.6

內層的字典鍵會被合併、排序以形成最終的索引。如果顯示指定了索引,則不會這樣

DataFrame(pop,index=[2001,2002,2003])
Nevada Ohio
2001 2.4 107.0
2002 2.9 3.6
2003 NaN NaN
pdata={'Ohio':frame3['Ohio'][:-1],'Nevada':frame3['Nevada'][:2]}
DataFrame(pdata)
Nevada Ohio
2000 NaN 1.5
2001 2.4 107.0

下表列出了DataFrame建構函式所能接受的各種資料

這裡寫圖片描述

如果設定了DataFrame的index和columns的name屬性,則這些資訊也會被顯示出來

frame3.index.name='year';frame3.columns.name='state'
frame3
state Nevada Ohio
year
2000 NaN 1.5
2001 2.4 107.0
2002 2.9 3.6

跟Series一樣,values屬性也會以二維ndarry的形式返回DataFrame中的資料

frame3.values
    array([[   nan,    1.5],
           [   2.4,  107. ],
           [   2.9,    3.6]])
如果DataFrame各列的資料型別不同,則值陣列的資料型別就會選用能相容所有列的數
frame2.values
    array([[2000, 'Ohio', 1.5, nan],
           [2001, 'Ohio', 1.7, -1.2],
           [2002, 'Ohio', 3.6, nan],
           [2001, 'Nevada', 2.4, -1.5],
           [2002, 'Nevada', 2.9, -1.7]], dtype=object)
索引物件:padas物件負責管理軸標籤和其他元資料(比如軸名稱等)。 構建Series和DataFrame時,所用到的任何陣列或其他序列的標籤會被轉換成一個index
obj=Series(range(3),index=['a','b','c'])
index=obj.index
index
    Index(['a', 'b', 'c'], dtype='object')
index[1:]
    Index(['b', 'c'], dtype='object')
index物件是不可以修改的(immutable),因此使用者不能對其進行修改
index[1]='d'
—————————————————————————
    TypeError                                 Traceback (most recent call last)

    <ipython-input-49-8be6e68dba2d> in <module>()
    ----> 1 index[1]='d'


    e:\python\lib\site-packages\pandas\core\indexes\base.py in __setitem__(self, key, value)
       1722 
       1723     def __setitem__(self, key, value):
    -> 1724         raise TypeError("Index does not support mutable operations")
       1725 
       1726     def __getitem__(self, key):


    TypeError: Index does not support mutable operations
index不可修改的重要性,這樣才能使得index物件在多個數據結構之間安全共享
index=pd.Index(np.arange(3))
obj2=Series([1.5,-2.5,0],index=index)
obj2.index is index

    True

下表列出了pandas庫內建的index類

這裡寫圖片描述

frame3
Nevada Ohio
2000 NaN 1.5
2001 2.4 107.0
2002 2.9 3.6
'Ohio' in frame3.columns
True
2003 in frame3.index
False

每個索引都一些方法和屬性,可用於設定邏輯並回答有關該索引所包含的資料的常見的問題 這裡寫圖片描述