1. 程式人生 > >利用Pandas進行資料分析(3)——統計、處理缺失值、層次化索引

利用Pandas進行資料分析(3)——統計、處理缺失值、層次化索引

注:此係列參考了樑斌老師的課件和《利用Python進行資料分析》一書。

import numpy as np
import pandas as pd
from pandas import DataFrame,Series
df_obj = pd.DataFrame(np.random.randn(5,4), columns = ['a', 'b', 'c', 'd'])
df_obj
a b c d
0 2.052675 -0.061795 -1.043487 -1.350961
1 0.328572 -0.752768 1.490905 0.694892
2 -0.215059 -0.025962 0.050865 1.061136
3 -1.005072 0.568074 -0.480307 0.262490
4 0.977688 -0.641019 1.120281 -0.617966
df_obj.sum()
a    2.138804
b   -0.913469
c    1.138257
d    0.049591
dtype: float64
df_obj.max()
a    2.052675
b    0.568074
c    1.490905
d    1.061136
df_obj.min(axis=1)
0   -1.350961
1   -0.752768
2   -0.215059
3   -1.005072
4   -0.641019
dtype: float64

統計描述

df_obj.describe()
a b c d
count 5.000000 5.000000 5.000000 5.000000
mean 0.427761 -0.182694 0.227651 0.009918
std 1.163919 0.533357 1.065463 0.985427
min -1.005072 -0.752768 -1.043487 -1.350961
25% -0.215059 -0.641019 -0.480307 -0.617966
50% 0.328572 -0.061795 0.050865 0.262490
75% 0.977688 -0.025962 1.120281 0.694892
max 2.052675 0.568074 1.490905 1.061136

對於非數值型資料,describe會產生另外一種彙總統計:

obj = Series(['a','a','b','c']*4)
obj
0     a
1     a
2     b
3     c
4     a
5     a
6     b
7     c
8     a
9     a
10    b
11    c
12    a
13    a
14    b
15    c
dtype: object
obj.describe()
count     16
unique     3
top        a
freq       8
dtype: object

描述和彙總統計

方法 說明
count 非NA值得數量
describe 針對series或各dataframe列計算彙總統計
min max 計算最小值和最大值
argmin,argmax 計算能夠獲取到最小值和最大值的索引位置(整數)
idxmin , idxmax 計算能夠獲取到最小值和最大值idea索引值
quantile 計算樣本的分位數(0到1)
sum 值得總和
mean 值得平均數
median 值的算數中位數
mad 根據平均值計算平均絕對離差
var 樣本值得方差
std 樣本值得標準差
skew 樣本值得偏度(三階矩)
kurt 樣本值的峰度(四階矩)
cumsum 樣本值的累計和
cummin,cummax 樣本值的累計最大值和累計最小值
cumprod 樣本值的累計積
diff 計算一階差分(對時間序列很有用)
pct_change 計算百分數變化

處理缺失值

string_data = Series(['aardvark', 'articchoke', 'np.nan', 'avocado'])
string_data
0      aardvark
1    articchoke
2        np.nan
3       avocado
dtype: object
string_data.isnull()
0    False
1    False
2    False
3    False
dtype: bool

Python內建的None值也會被當作NA處理:

string_data[0] = None
string_data.isnull()
0     True
1    False
2    False
3    False
dtype: bool

NA處理方法

方法 說明
count 非NA值得數量
dropna 根據各標籤的值中是否存在缺失資料對軸標籤進行過濾,可通過閾值調節對缺失值得容忍度
fillna 用指定值或插值方法(如ffill或bfill)填充確實資料
isnull 返回一個含有布林值的物件,這些布林值表示哪些值是缺失值/NA,該物件的型別與源型別一樣
notnull isnull的否定式

濾除缺失資料,

可以使用notnull()函式(和isnull是對應的)
丟棄含有缺失值的行:dropna()

填充缺失資料

使用最多的就是fillna函式

具體用法這裡就不再贅述

層次化索引

層次化索引(hierarchical indexing)是pandas的一項重要功能,它使你能在一個軸上擁有多個(兩個以上)索引級別
請看以下例子

data = Series(np.random.randn(10), index = [['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd', 'd' ],[1,2,3,1,2,3,1,2,2,3]])
data
a  1    0.169239
   2    0.689271
   3    0.879309
b  1   -0.699176
   2    0.260446
   3   -0.321751
c  1    0.893105
   2    0.757505
d  2   -1.223344
   3   -0.802812
dtype: float64

索引方式

data['b':'d']
b  1   -0.699176
   2    0.260446
   3   -0.321751
c  1    0.893105
   2    0.757505
d  2   -1.223344
   3   -0.802812
dtype: float64

內層選取

data[:, 2]
a    0.689271
b    0.260446
c    0.757505
d   -1.223344
dtype: float64

透視表生成(資料重塑)

data.unstack()
1 2 3
a 0.169239 0.689271 0.879309
b -0.699176 0.260446 -0.321751
c 0.893105 0.757505 NaN
d NaN -1.223344 -0.802812
data.unstack().stack()
a  1    0.169239
   2    0.689271
   3    0.879309
b  1   -0.699176
   2    0.260446
   3   -0.321751
c  1    0.893105
   2    0.757505
d  2   -1.223344
   3   -0.802812
dtype: float64

交換分層順序

data
a  1    0.169239
   2    0.689271
   3    0.879309
b  1   -0.699176
   2    0.260446
   3   -0.321751
c  1    0.893105
   2    0.757505
d  2   -1.223344
   3   -0.802812
dtype: float64
data.swaplevel()
1  a    0.169239
2  a    0.689271
3  a    0.879309
1  b   -0.699176
2  b    0.260446
3  b   -0.321751
1  c    0.893105
2  c    0.757505
   d   -1.223344
3  d   -0.802812
dtype: float64

交換並排序分層

data.swaplevel().sortlevel()
1  a    0.169239
   b   -0.699176
   c    0.893105
2  a    0.689271
   b    0.260446
   c    0.757505
   d   -1.223344
3  a    0.879309
   b   -0.321751
   d   -0.802812
dtype: float64

是不是很神奇~

此頁內容可以參考《利用pandas進行資料分析》的第五章的後半部分