1. 程式人生 > >python資料分析之(3)pandas

python資料分析之(3)pandas

pandas的安裝可以參見前面的博文,http://blog.csdn.net/piaoxuezhong/article/details/54023951
pandas 是基於 Numpy 構建的含有更高階資料結構和工具的資料分析包
類似於 Numpy 的核心是 ndarray,pandas 也是圍繞著 Series 和 DataFrame 兩個核心資料結構展開的 。Series 和 DataFrame 分別對應於一維的序列和二維的表結構。pandas 約定俗成的匯入方法如下:

>>> from pandas import Series,DataFrame
>>> import pandas as pd

1.Series

Series 可以看做一個定長的有序字典。基本任意的一維資料都可以用來構造 Series 物件:
>>> s=Series([1,2,'abc'])
>>> s
0      1
1      2
2    abc
dtype: object

Series 物件包含兩個主要的屬性:index 和 values,分別為上例中左右兩列。因為傳給構造器的是一個列表,所以 index 的值是從 0 起遞增的整數,如果傳入的是一個類字典的鍵值對結構,就會生成 index-value 對應的 Series;或者在初始化的時候以關鍵字引數顯式指定一個 index 物件:

>>> s=Series(data=[1,2,'abc'],index=['no1','no2','no3'])
>>> s
no1      1
no2      2
no3    abc
dtype: object
>>> s.index
Index([no1, no2, no3], dtype=object)
>>> s.values
array([1, 2, abc], dtype=object)
Series 物件的元素會嚴格依照給出的 index 構建,如果 data 引數是有鍵值對的,那麼只有 index 中含有的鍵會被使用;如果 data 中缺少響應的鍵,即使給出 NaN 值,這個鍵也會被新增。Series 的 index 和 values 的元素之間雖然存在對應關係,但這與字典的對映不同。index 和 values 實際仍為互相獨立的 ndarray 陣列。Series 這種使用鍵值對的資料結構最大的好處在於,Series 間進行算術運算時,index 會自動對齊。
另外,Series 物件和它的 index 都含有一個 name 屬性:
>>> s.name='series_s'
>>> s.index.name='s\' index'
>>> s
s' index
no1           1
no2           2
no3         abc
Name: series_s, dtype: object

2.DataFrame

DataFrame 是一個表格型的資料結構,它含有一組有序的列(類似於 index),每列可以是不同的值型別(不像 ndarray 只能有一個 dtype)。基本上可以把 DataFrame 看成是共享同一個 index 的 Series 的集合。DataFrame 的構造方法與 Series 類似,只不過可以同時接受多條一維資料來源,每一條都會成為單獨的一列:

>>> data={'name':['fcq','jj','wym','xrr'],\
	'year':[1989,1989,1989,1988],\
        'm/f':['m','f','f','f']}
>>> data
{'m/f': ['m', 'f', 'f', 'f'], 'name': ['fcq', 'jj', 'wym', 'xrr'], 'year': [1989, 1989, 1989, 1988]}
>>> df=DataFrame(data)
>>> df
  m/f name  year
0   m  fcq  1989
1   f   jj  1989
2   f  wym  1989
3   f  xrr  1988
雖然引數 data 看起來是個字典,但字典的鍵並非充當 DataFrame 的 index 的角色,而是 Series 的 “name” 屬性。這裡生成的 index 仍是 “0123”。完整的 DataFrame 構造器引數為:DataFrame(data=None,index=None,coloumns=None),columns 即 “name”:
>>> df=DataFrame(data,index=['no1','no2','no3','no4'])
>>> df
    m/f name  year
no1   m  fcq  1989
no2   f   jj  1989
no3   f  wym  1989
no4   f  xrr  1988
>>> df.columns
Index([m/f, name, year], dtype=object)
>>> df.index
Index([no1, no2, no3, no4], dtype=object)

3.物件屬性

3.1查詢索引

查詢某個值在陣列中的索引,類似於 Python 內建的 list.index(value) 方法。可以通過布林索引來實現。比如我們想在一個 Series 中尋找到 ‘f’:
>>> from pandas import Series,DataFrame
>>> import pandas as pd
>>> s=Series(list('I am fcq~'))
>>> s
0    I
1     
2    a
3    m
4     
5    f
6    c
7    q
8    ~
dtype: object
>>> s[s='f']
SyntaxError: invalid syntax
>>> s[s=='f']
5    f
dtype: object

3.2重新索引

Series 物件的重新索引通過reindex(index=None,**kwargs) 方法實現。**kwargs 中常用的引數有:method=None,fill_value=np.NaN:

>>> s2=Series([88,99,89,90],index=['ENG','CHE','PHY','CPT'])
>>> a=['ENG','CPT','CHE','PHY','MATH']
>>> s2.reindex(a)
ENG     88
CPT     90
CHE     99
PHY     89
MATH   NaN
dtype: float64
>>> s2.reindex(a,fill_value=0)
ENG     88
CPT     90
CHE     99
PHY     89
MATH     0
dtype: int64

3.3排序和排名

Series 的 sort_index(ascending=True) 方法可以對 index 進行排序操作,ascending 引數用於控制升序或降序,預設為升序。
若要按值對 Series 進行排序,當使用 .order(na_last=True, ascending=True, kind='mergesort') 方法,任何缺失值預設都會被放到 Series 的末尾。在 DataFrame 上,.sort_index(axis=0, by=None, ascending=True) 方法多了一個軸向的選擇引數與一個 by 引數,by 引數的作用是針對某一(些)列進行排序(不能對行使用 by 引數):
>>> s2.sort_index(ascending=True)
CHE    99
CPT    90
ENG    88
PHY    89
dtype: int64
排名(Series.rank(method='average', ascending=True))的作用與排序的不同之處在於,他會把物件的 values 替換成名次(從 1 到 n)。這時唯一的問題在於如何處理平級項,方法裡的 method 引數就是起這個作用的,他有四個值可選:average, min, max, first。
>>> s3=Series([3,2,0,3],index=list('abcd'))
>>> s3
a    3
b    2
c    0
d    3
dtype: int64
>>> s3.rank()
a    3.5
b    2.0
c    1.0
d    3.5
dtype: float64
>>> s3.rank(method='max')
a    4
b    2
c    1
d    4
dtype: float64
>>> s3.rank(method='min')
a    3
b    2
c    1
d    3
dtype: float64
>>> s3.rank(method='first')
a    3
b    2
c    1
d    4
dtype: float64

3.4統計方法

pandas 物件有一些統計方法,它們大部分都屬於約簡和彙總統計,用於從 Series 中提取單個值,或從 DataFrame 的行或列中提取一個 Series。比如 DataFrame.mean(axis=0,skipna=True) 方法,當資料集中存在 NA 值時,這些值會被簡單跳過,除非整個切片(行或列)全是 NA,如果不想這樣,則可以通過 skipna=False 來禁用此功能:
>>> data = {'state':['Ohino','Ohino','Ohino','Nevada','Nevada'],
        'year':[2000,2001,2002,2001,2002],
        'pop':[1.5,1.7,3.6,2.4,2.9]}
>>> df=DataFrame(data)
>>> df
   pop   state  year
0  1.5   Ohino  2000
1  1.7   Ohino  2001
2  3.6   Ohino  2002
3  2.4  Nevada  2001
4  2.9  Nevada  2002
>>> df.mean()
pop        2.42
year    2001.20
dtype: float64
>>> df.mean(axis=1)
0    1000.75
1    1001.35
2    1002.80
3    1001.70
4    1002.45
dtype: float64
其他常用的統計方法有:
count 非 NA 值的數量
describe 針對 Series 或 DF 的列計算彙總統計
min , max 最小值和最大值
argmin , argmax 最小值和最大值的索引位置(整數)
idxmin , idxmax 最小值和最大值的索引值
quantile 樣本分位數(0 到 1)
sum 求和
mean 均值
median 中位數
mad 根據均值計算平均絕對離差
var 方差
std 標準差
skew 樣本值的偏度(三階矩)
kurt 樣本值的峰度(四階矩)
cumsum 樣本值的累計和
cummin , cummax 樣本值的累計最大值和累計最小值
cumprod 樣本值的累計積
diff 計算一階差分(對時間序列很有用)
pct_change 計算百分數變化

參考:

http://www.open-open.com/lib/view/open1402477162868.html

https://my.oschina.net/lionets/blog/277847

http://www.cnblogs.com/skying555/p/5914391.html

http://www.cnblogs.com/skying555/p/5914391.html