1. 程式人生 > 其它 >python資料分析模組有哪些_Python資料分析模組pandas整理

python資料分析模組有哪些_Python資料分析模組pandas整理

技術標籤:python資料分析模組有哪些

pandas是python的一個數據分析包,是基於Numpy構建的含有更高資料結構和工具的資料分析包。

類似於Numpy的和效能是ndarry; pandas是圍繞著Series和DataFrame兩個核心資料結構展開的,Series和DataFrame分別對應於一維的序列和二維的表結構。

一般pandas的匯入約定俗成的方法如下:

from pandas import Series,DataFrame

import pandas as pd

Series

Series可以看做是一個定長有序的字典,基本任意的一維資料都可以用來構造Series物件。

>>> s = Series([1,2,3.0,'abc'])

>>> s

0 1

1 2

2 3

3 abc

dtype: object

Series的互動式顯示的字串表示形式是索引在左邊,值在右邊。因為沒有指定索引,一個包含整數0到N-1(N是資料的長度)的預設索引被建立。可以分別通過values和index來分別獲取Series的陣列表示和索引物件。如果傳入類字典的鍵值對結構,或者在初始化的時候顯示的指定一個index物件,就會形成index-value對應的series。如下所示:

>>> data={'a':1,'b':3,'c':5,'d':7}

>>> s=pd.Series(data)

>>> s

a 1

b 3

c 5

d 7

dtype: int64

>>> s2=pd.Series([1,3,5,7],index=['a','b','c','d'])

>>> s2

a 1

b 3

c 5

d 7

dtype: int64

>>> s.index

Index([u'a', u'b', u'c', u'd'], dtype='object')

>>> s.values

array([1, 3, 5, 7], dtype=int64)

Series的index和values的元素之間雖然存在對應關係, 但這與字典的對映是不同的,index和values實際仍為獨立的narray陣列,因此Series的效能是OK的。

與正規的Numpy陣列相比,你可以使用索引裡的值來選擇一個單一值或者一個值集。

>>> s[2]

5

>>> s['c']

5

>>> s[['d','a','b']]

d 7

a 1

b 3

dtype: int64

>>> s['b']=9

>>> s

a 1

b 9

c 5

d 7

dtype: int64

另外,Series和index都含有一個name屬性。

>>> s.name='a_series'

>>> s.index.name='index'

>>> s

index

a 1

b 9

c 5

d 7

Name: a_series, dtype: int64

NumPy陣列操作,值與索引之間的對應關係不會改變。

>>> s[s>5]

index

b 9

d 7

Name: a_series, dtype: int64

>>> s

index

a 1

b 9

c 5

d 7

Name: a_series, dtype: int64

>>> s*2

index

a 2

b 18

c 10

d 14

Name: a_series, dtype: int64

>>> np.exp(s)

index

a 2.718282

b 8103.083928

c 148.413159

d 1096.633158

Name: a_series, dtype: float64

另外一種思考方式,Series是一個定長的有序的字典,因為它把索引和值進行對映。

>>> 'a' in s

True

>>> '5' in s

False

>>> 5 in s

False

上文曾提到過,如果有一些資料在python字典中,可以使用傳遞字典來從這些資料中建立一個Series:

>>> sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000}

>>> obj3=pd.Series(sdata)

>>> obj3

Ohio 35000

Oregon 16000

Texas 71000

dtype: int64

同時,在傳遞字典的時候我們還可以額外的指定一組index,並且最終以傳入的index為止,具體如下所示:

>>> states = ['California', 'Ohio', 'Oregon', 'Texas']

>>> obj4 = pd.Series(sdata, index=states)

>>> obj4

California NaN

Ohio 35000

Oregon 16000

Texas 71000

dtype: float64

sdata中的三個值都被放在了合適的位置上,但是因為滅幼發現California的值,就出現了NaN,表示缺失值。在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

還有一個重要作用是在算術運算中Series會自動對齊不同索引的資料

>>> obj5=pd.Series(obj3,index=['Ohio','Oregon','Texas','Togo'])

>>> obj5

Ohio 35000

Oregon 16000

Texas 71000

Togo NaN

dtype: float64

>>> obj5+obj4

California NaN

Ohio 70000

Oregon 32000

Texas 142000

Togo NaN

dtype: float64

Series的索引也可以通過賦值就地改變:

>>> obj4.index=['a','b','c','d']

>>> obj4

a NaN

b 35000

c 16000

d 71000

dtype: float64

DataFrame

它是一個表格型的資料結構,它由一組有序的列(類似於index),每一列可以是不同的資料型別。基本上可以將DataFrame看做是共享一個index的Series的集合。

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=pd.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

雖然data看起來是個字典,但是字典的鍵不是充當DataFrame中的index的角色,而是Series中的name屬性,而DataFrame的index仍是[0,1,2,3,4]。

其他的構建方式:

1、字典的字典:

>>> d={'one':{'a':1,'b':2,'c':3},'two':{'a':1,'b':2,'c':3,'d':4}}

>>> df=pd.DataFrame(d)

>>> df

one two

a 1 1

b 2 2

c 3 3

d NaN 4

2、series的字典:

>>> d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}

>>> df=pd.DataFrame(d)

>>> df

one two

a 1 1

b 2 2

c 3 3

d NaN 4

3、列表的字典,要求每個列表的長度是一致的否則會報錯:

>>> d={'one':[1,2,3,4],'two':[3,4,5,6]}

>>> df=pd.DataFrame(d)

>>> df

one two

0 1 3

1 2 4

2 3 5

3 4 6

>>> d={'one':[1,2,3,4],'two':[3,4,5]}

>>> df=pd.DataFrame(d)

ValueError: arrays must all be same length

4、字典的列表,其中每個字典代表的是每條記錄(DataFrame中的一行),字典中的每個值對應的是這條記錄的相關屬性。

>>> d = [{'one' : 1,'two':1},{'one' : 2,'two' : 2},{'one' : 3,'two' : 3},{'two' : 4}]

>>> df=pd.DataFrame(d)

>>> df

one two

0 1 1

1 2 2

2 3 3

3 NaN 4

其實比較完整的DataFrame的構造器引數為DataFrame(data=None,index=None,columns=None),index為索引,columns為name。如果在columns中設定列的順序,DataFrame的列將會精確的按照所傳遞的順序排列。

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 = pd.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

>>> frame=pd.DataFrame(data, columns=['year', 'state', 'pop'])

>>> frame

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

DataFrame轉換為其他型別

df.to_dict(outtype='dict')

outtype的引數為:‘dict'、'list'、'Series’、‘records'。dict返回的是dict of dict ,list返回的是列表的字典,series返回的是序列的字典,records返回的是字典的列表。

head和tail方法可以顯示DataFrame的前N條和後N條記錄,N為引數,預設值為5。這通常是拿到DataFrame後的第一個命令,可以方便的瞭解資料內容和含義。

元組

如果df的某一列為元組,如果使用每一個元組的元素呢?

df=pd.DataFrame(out.to

In [1]: from pandas import *

In [2]: def calculate(x):

...: return x*2, x*3

...:

In [3]: df = DataFrame({'a': [1,2,3], 'b': [2,3,4]})

In [4]: df

Out[4]:

a b

0 1 2

1 2 3

2 3 4

In [5]: df["A1"], df["A2"] = zip(*df["a"].map(calculate))

In [6]: df

Out[6]:

a b A1 A2

0 1 2 2 3

1 2 3 4 6

2 3 4 6 9

list())df.columns=['KS-stat', 'P-value']print df#輸出 KS-stat P-value0 -2.12978778869 0.0436431 3.50655433879 0.0018132 -1.2221274198 0.2335273 -0.977154419818 0.338240當我們使用map函式返回多個值時,真正的返回值是一個元組的Series,如果想使用元組中的每一個元素時可以用上面方法來進行獲取。

合併兩列資料

df['columns3'] = zip(df['columns2'],df['columns1'])

#會生成一個元組

在使用新合成的這一列時,按照元組的使用方法來使用資料。

如果一個函式中需要使用兩列引數,使用方法為:

df[columnsNew ] = df[[columns1,columns2]].apply(func,asix=1)

def func(x):

aa = x[0]

bb = x[1]

asix = 1 表示一行資料進入func,以元組的形式。返回值一試Series。

或者按照如下方式:

In [3]: df = DataFrame({'a': [1,2,3], 'b': [2,3,4]})

In [4]: df

Out[4]:

a b

0 1 2

1 2 3

2 3 4

def func(x):

value = x['a']

return value*2

df['doubleA'] = df.apply(func,axis=1)

進一步,如果方程func需要額外的引數時:

def func(x,addional):

value = x['a']

return value*addional

df['newA']=df.apply(lambda x:func(x,5),axis=1)

函式返回兩個變數