利用Python進行數據分析——pandas入門
阿新 • • 發佈:2018-05-09
平均值 標準 AR 找不到 recent 位置 index 操作 基於 6.
利用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入門