1. 程式人生 > >利用Python進行數據分析——pandas入門

利用Python進行數據分析——pandas入門

平均值 標準 AR 找不到 recent 位置 index 操作 基於

利用Python進行數據分析——pandas入門

  • 基於NumPy建立的
  • from pandas importSeries,DataFrame,import pandas as pd

一、兩種數據結構

1.Series

類似於Python的字典,有索引和值

創建Series

#不指定索引,默認創建0-N
In [54]: obj = Series([1,2,3,4,5])

In [55]: obj
Out[55]:
0    1
1    2
2    3
3    4
4    5
dtype: int64
#指定索引
In [56]: obj1 = Series([1,2,3,4,5],index=[‘a‘,‘b‘,‘c‘,‘d‘,‘e‘])

In [57]: obj1
Out[57]:
a    1
b    2
c    3
d    4
e    5
dtype: int64

#將Python中的字典轉換為Series
In [63]: dic = {‘a‘:1,‘b‘:2,‘c‘:3}

In [64]: obj2 = Series(dic)

In [65]: obj2
Out[65]:
a    1
b    2
c    3
dtype: int64

對Series進行數組運算(根據布爾型數組進行過濾、標量乘法、應用函數等)依舊會保留索引和值之間的對應關系。
對應index的值找不到就用NAN表示,且在算數運算中會自動補齊數據,不存在用NAN

2.DataFrame

DataFrame是一個表格型的數據結構,既有行索引也有列索引。

創建DataFrame

#傳進去一個等長列表組成的字典
IIn [75]: data = {‘name‘:[‘nadech‘,‘bob‘],‘age‘:[23,25],‘sex‘:[‘male‘,‘female‘]}

In [76]: DataFrame(data)
Out[76]:
   age    name     sex
0   23  nadech    male
1   25     bob  female

#指定列的順序
In [77]: DataFrame(data,columns=[‘sex‘,‘name‘,‘age‘])
Out[77]:
      sex    name  age
0    male  nadech   23
1  female     bob   25
# 嵌套字典創建DataFrame

DataFrame的操作

#獲取某一列
In [82]: frame[‘age‘]  /frame.age
Out[82]:
0    23
1    25
Name: age, dtype: int64

#賦值
In [86]: frame2
Out[86]:
   age     sex    name grade
0   23    male  nadech   NaN
1   25  female     bob   NaN

In [87]: frame2[‘grade‘]=12

In [88]: frame2
Out[88]:
   age     sex    name  grade
0   23    male  nadech     12
1   25  female     bob     12

Index對象

In [14]: index = frame.index

In [15]: index
Out[15]: RangeIndex(start=0, stop=3, step=1)
# index 對象不可修改
In [16]: index[0]=3
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

二、基本功能

1.Series和DataFrame的重新索引

#Series
In [25]: obj = Series([‘nadech‘,‘aguilera‘,‘irenieee‘],index=[‘a‘,‘b‘,‘c‘])

In [26]: obj
Out[26]:
a      nadech
b    aguilera
c    irenieee
dtype: object

In [27]: obj.reindex([‘c‘,‘b‘,‘a‘])
Out[27]:
c    irenieee
b    aguilera
a      nadech
dtype: object


#####DataFrame
In [21]: frame
Out[21]:
   one  two  three
a    0    1      2
b    3    4      5
c    6    7      8
#直接傳進去的列表是對行的重新索引
In [22]: frame.reindex([‘c‘,‘b‘,‘a‘])
Out[22]:
   one  two  three
c    6    7      8
b    3    4      5
a    0    1      2
#對列的重新索引需要參數columns
In [24]: frame.reindex(columns=[‘three‘,‘two‘,‘one‘])
Out[24]:
   three  two  one
a      2    1    0
b      5    4    3
c      8    7    6

2.刪除指定軸上的項

#Series
In [28]: obj.drop(‘c‘)
Out[28]:
a      nadech
b    aguilera
dtype: object

In [30]: obj.drop([‘b‘,‘a‘])
Out[30]:
c    irenieee
dtype: object

#####DataFrame

frame刪除行索引直接刪除,列索引刪除需要指定axis=1

In [39]: frame
Out[39]:
   one  two  three
a    0    1      2
b    3    4      5
c    6    7      8

In [40]: frame.drop(‘a‘)
Out[40]:
   one  two  three
b    3    4      5
c    6    7      8

In [41]: frame.drop(‘one‘,axis=1)
Out[41]:
   two  three
a    1      2
b    4      5
c    7      8

3.索引、選取和過濾

Series索引
In [8]: obj
Out[8]:
a 0
b 1
c 2
d 3
dtype: int32

In [9]: obj[‘a‘]
Out[9]: 0

In [10]: obj[0]
Out[10]: 0

#註意利用標簽切片和index 0-N是不同的
In [11]: obj[2:3]
Out[11]:
c    2
dtype: int32

In [12]: obj[‘c‘:‘d‘]
Out[12]:
c    2
d    3
dtype: int32

DataFrame索引

#索取frame的列
In [24]: frame
Out[24]:
   one  two  three  four
a    0    1      2     3
b    4    5      6     7
c    8    9     10    11
d   12   13     14    15

In [25]: frame[‘one‘]
Out[25]:
a     0
b     4
c     8
d    12
Name: one, dtype: int32

In [26]: frame[[‘one‘,‘two‘]]
Out[26]:
   one  two
a    0    1
b    4    5
c    8    9
d   12   13
#索取frame的行,標簽索引
In [33]: frame.ix[‘a‘]
Out[33]:
one      0
two      1
three    2
four     3
Name: a, dtype: int32

In [31]: frame.ix[[‘a‘,‘b‘]]
Out[31]:
   one  two  three  four
a    0    1      2     3
b    4    5      6     7

#同時選取行和列
In [35]: frame.ix[[‘a‘,‘b‘],[‘one‘,‘two‘]]
Out[35]:
   one  two
a    0    1
b    4    5

4.算數運算和數據對齊

#當存在不同的索引對計算時,會產生並集,和NAN,通過fill_value 可以傳入參數
  • add()
  • sub()
  • div()
  • mul()

5.Series和DataFrame的運算

#series的索引會匹配到dataframe的列,然後向下廣播
In [46]: frame
Out[46]:
   one  two  three  four
a    0    1      2     3
b    4    5      6     7
c    8    9     10    11
d   12   13     14    15

In [47]: obj = frame.ix[‘a‘]

In [48]: obj
Out[48]:
one      0
two      1
three    2
four     3
Name: a, dtype: int32

In [49]: frame - obj
Out[49]:
   one  two  three  four
a    0    0      0     0
b    4    4      4     4
c    8    8      8     8
d   12   12     12    12

#可以指定series匹配到dataframe的列(即index)然後向右廣播,即沿著列廣播
In [51]: frame
Out[51]:
   one  two  three  four
a    0    1      2     3
b    4    5      6     7
c    8    9     10    11
d   12   13     14    15

In [52]: obj2 = Series(np.arange(4),index=[‘a‘,‘b‘,‘c‘,‘d‘])

In [53]: obj2
Out[53]:
a    0
b    1
c    2
d    3
dtype: int32

In [54]: frame.sub(obj2,axis=0)   #dataframe的行用0、列用1
Out[54]:
   one  two  three  four
a    0    1      2     3
b    3    4      5     6
c    6    7      8     9
d    9   10     11    12

5.排序

#按軸上的索引排序

   #Series
    In [6]: obj
    Out[6]:
    a    0
    c    1
    b    2
    d    3
    In [8]: obj.sort_index()
    Out[8]:
    a    0
    b    2
    c    1
    d    3
    dtype: int32
    #DataFrame
    frame.sort_index()
    frame.sort_index(axis=1)
    

6.obj.index.is_unique可以用來判斷index是否唯一

三、匯總和計算描述統計

描述和匯總統計

  • count 非Na值的數量
  • describe 針對Series或各DataFrame列計算匯總統計
  • min/max 最下最大值 都是每列中的最值
  • aigmin/argmax 最小、大值的索引位置
  • idxmin/idxmax 能獲取到最小值和最大值的索引值
  • quantile 計算樣本的分位數
  • sum() 計算每列的和
  • mean()計算每列的均值
  • median 計算每列的算數中位數
  • mad() 根據平均值計算平均絕對離差
  • var 計算每列的方差
  • std 計算每列的標準差
  • skew 樣本值的偏度(三階矩)
  • kurt 樣本值的峰度(四階矩)
  • cumsum 樣本值的累計和
  • cummin/cummax 累計最大值和累計最小值
  • cumprod 累計積
  • diff 計算一階差分
  • pct_change 計算百分數變化

Series的唯一值、值的count數、

  • obj.unique() 返回唯一值數組
  • obj.value_counts() 計算各個值出現的次數
  • pd.value_counts(obj.values) 這個也可以用來計算count數,是頂層的方法
  • isin([]) 判斷Series各個值是否包含於傳入的值序列中

四、處理缺失數據

NAN處理方法

  • dropna 刪除空值
  • fillna 給空值賦值
  • isnull 判斷是否有空值存在
  • notnull

DataFrame.drop()復雜情況

In [49]: fram1
Out[49]:
     0    1    2
0  1.0  6.5  3.0
1  1.0  NaN  NaN
2  NaN  NaN  NaN
3  NaN  6.5  3.0

In [50]: cleaned = fram1.dropna()

In [51]: cleaned
Out[51]:
     0    1    2
0  1.0  6.5  3.0

In [52]: fram1.dropna(how=‘all‘)
Out[52]:
     0    1    2
0  1.0  6.5  3.0
1  1.0  NaN  NaN
3  NaN  6.5  3.0

#如上形式丟棄列的空值,傳入axis=1

填充缺失值

obj.fillna()暴力填充
fram.fillna({1:0.1,2:0.2}) 對dataframe可以指定列填充對應的缺失值
#傳入method,可以給每列填充一個上一個非空的數字,並且可以通過limit限制每列填充的個數
implace =True 會產生新的對象

In [57]: df
Out[57]:
          0         1         2
0 -0.018286  0.246567  1.115108
1  0.722105  0.984472 -1.709935
2  1.477394       NaN  1.362234
3  0.077912       NaN  0.414627
4  0.530048       NaN       NaN
5  0.294424       NaN       NaN

In [58]: df.fillna(method=‘ffill‘)
Out[58]:
          0         1         2
0 -0.018286  0.246567  1.115108
1  0.722105  0.984472 -1.709935
2  1.477394  0.984472  1.362234
3  0.077912  0.984472  0.414627
4  0.530048  0.984472  0.414627
5  0.294424  0.984472  0.414627

In [59]: df.fillna(method=‘ffill‘,limit=2)
Out[59]:
          0         1         2
0 -0.018286  0.246567  1.115108
1  0.722105  0.984472 -1.709935
2  1.477394  0.984472  1.362234
3  0.077912  0.984472  0.414627
4  0.530048       NaN  0.414627
5  0.294424       NaN  0.414627
    

五、層次化索引

DataFrame和層次化索引可以互相轉換
frame.stack()  /unstack()

利用Python進行數據分析——pandas入門