pandas基本功能 - 彙總和計算描述統計
阿新 • • 發佈:2021-01-16
文章目錄
pandas 在數理統計上能夠非常簡單的獲取到相關的計算值,本文中從常用的數學和統計方法,到簡單的資料處理,再到層次化索引的簡單介紹,
1.1 常用的數學和統計方法
方法 | 說明 |
---|---|
count | 非NA值的數量 |
describe方法 | 針對Series或各DataFrame列計算總 統計 |
min/max | 計算最小值、最大值 |
argmin、argmax | 計算能夠獲取到最小值和最大值的索 引位置(整數) |
idxmin、idxmax | 計算能夠獲取到最小值和最大值的索 引值 |
quantile | 計算樣本的分位數(0到1) |
sum | 值的總和 |
mean | 值的平均數 |
median | 值的算術中位數(50%分位數) |
mad | 根據平均值計算平均絕對離差 |
var | 樣本數值的方差 |
std | 樣本值的標準差 |
cumsum | 樣本值的累計和 |
cummin、cummax | 樣本值的累計最小值、最大值 |
cumprod | 樣本值的累計積 |
Pct_change | 計算百分數變化 |
import numpy as np
import pandas as pd
arr = np.random.random((8, 3))
df = pd.DataFrame(arr, columns=['A','B','C'])
print(df.describe()) # 輸出所有的常用數學統計量
輸出
A B C
count 8.000000 8.000000 8.000000
mean 0.517492 0.465855 0.729173
std 0.359797 0.330637 0.210950
min 0.021359 0.081989 0.350208
25% 0.302370 0.239486 0.598300
50% 0.550394 0.371734 0.792829
75% 0.799502 0.752754 0.864155
max 0.940869 0.993853 0.961362
1.2 相關係數與協方差
# 相關係數
print(df.corr(), end='\n\n')
# 協方差
print(df.cov())
輸出
A B C
A 1.000000 -0.241478 -0.696313
B -0.241478 1.000000 -0.387690
C -0.696313 -0.387690 1.000000
A B C
A 0.129454 -0.028727 -0.052850
B -0.028727 0.109321 -0.027041
C -0.052850 -0.027041 0.044500
在上述的基礎上我們還能夠繼續繪製熱力圖,將每個變數之間的資料關係表示的更加直接;
import seaborn as sns
import matplotlib.pyplot as plt
# 隨機生成資料
arr = np.random.random((8, 3))
df = pd.DataFrame(arr, columns=['A','B','C'])
%matplotlib inline
corr = df.corr() # 計算協方差
sns.heatmap(corr,
xticklabels = corr.columns.values,
yticklabels = corr.columns.values) # 畫熱力圖
plt.show()
輸出
1.2.1 指定軸計算相關值
arr = np.random.random((8, 3))
df = pd.DataFrame(arr, columns=['A','B','C'])
print(df,end='\n\n')
print(df.mean(axis=1),end='\n\n') # 輸出的是Series物件
print(df.mean(axis=0))# 輸出的是Series物件
輸出
A B C
0 0.779852 0.409911 0.470607
1 0.608793 0.327177 0.177189
2 0.147843 0.380895 0.495957
3 0.782524 0.626356 0.665627
4 0.223091 0.702009 0.605694
5 0.732876 0.151342 0.647262
6 0.656550 0.145362 0.909695
7 0.873951 0.871516 0.565453
0 0.553457
1 0.371053
2 0.341565
3 0.691502
4 0.510265
5 0.510493
6 0.570535
7 0.770306
dtype: float64
A 0.600685
B 0.451821
C 0.567186
dtype: float64
1.3 唯一值、值計數以及成員資格
- unique方法用於獲取Series唯一值陣列
- value_counts方法,用於計算一個Series中各值出現的頻率
- isin方法,用於判斷向量化集合的成員資格,可用於選取Series中或者DataFrame中列中資料的子集
1.3.1 Series 物件
ser = pd.Series(['d','c','d','c','d','d','b','c','d','a',])
print(ser.unique(), end='\n\n')
print(ser.value_counts(), end='\n\n')# series 物件, 預設情況下會按值出現頻率降序排列
print(ser.isin(['a', 'c']), end='\n\n') # 審查成員資格簡單理解就是原資料是否在指定集合中,並返回一個只包含 True|False 的向量
print(ser[ser.isin(['a', 'c'])])
輸出
['d' 'c' 'b' 'a']
d 5
c 3
a 1
b 1
dtype: int64
0 False
1 True
2 False
3 True
4 False
5 False
6 False
7 True
8 False
9 True
dtype: bool
1 c
3 c
7 c
9 a
dtype: object
1.3.2 DataFream物件
df = pd.DataFrame({
'Tom' : [100, 96, 72, 65],
'Merry' : [90, 89, 83, 92],
'Jonh' : [45, 78, 92, 20]
})
print(df['Tom'].describe(), end='\n\n')
print(df['Merry'].max())
輸出
count 4.00000
mean 83.25000
std 17.34695
min 65.00000
25% 70.25000
50% 84.00000
75% 97.00000
max 100.00000
Name: Tom, dtype: float64
92
對DataFrame的處理本質上還是對Series 的處理,通過對索引獲取到某一列,也就是一個Series 物件之後再呼叫其相關方法就能夠得到相關資料。
2 處理缺失資料
2.1 缺失值檢測
方法 | 說明 |
---|---|
drop na | 根據標籤的值中是否存在缺失資料對軸標籤進行過濾(刪除),可通過 閾值調節對缺失值的容忍度 |
fillna | 用指定值或插值方法(如ffill或bfill)填充缺失資料 |
isnul l | 返回一個含有布林值的物件,這些布林值表示哪些值是缺失值NA |
notn ull | Isnull的否定式 |
df = pd.DataFrame([[ 'Tom' ,np.nan ,456.67, 'W'],
[ 'Merry',34,4567.34 ,np.NaN] ,
[ 'John ' ,23 , np.NaN,'M'],
[ 'Joe',18,342.45,'F']
],columns=[ 'name ' , 'age ' , ' salary' , ' gender'])
print(df, end='\n\n')
print(df.isnull(), end='\n\n')
print(df.notnull(), end='\n\n')
輸出
name age salary gender
0 Tom NaN 456.67 W
1 Merry 34.0 4567.34 NaN
2 John 23.0 NaN M
3 Joe 18.0 342.45 F
name age salary gender
0 False True False False
1 False False False True
2 False False True False
3 False False False False
name age salary gender
0 True False True True
1 True True True False
2 True True False True
3 True True True True
2.2 過濾缺失資料
df = pd.DataFrame([
[1., 3.4, 4],
[np.nan, np.nan, np.nan],
[np.nan, 6.5,7. ]
])
print(df, end='\n\n')
print(df.dropna(), end='\n\n') # 預設刪除全部的異常行
print(df.dropna(how='all'), end='\n\n') # 僅刪除某行內的值全部是異常的行
輸出
0 1 2
0 1.0 3.4 4.0
1 NaN NaN NaN
2 NaN 6.5 7.0
0 1 2
0 1.0 3.4 4.0
0 1 2
0 1.0 3.4 4.0
2 NaN 6.5 7.0
2.3 填充缺失資料
df = pd.DataFrame(np.random.random((4, 5)))
# 生成異常資料
df[df<0.4] = np.nan
# 將所有的異常值都填充為-1
print(df.fillna(-1))
輸出
0 1 2 3 4
0 0.531901 0.414796 -1.000000 0.813520 -1.000000
1 0.526373 -1.000000 0.578893 0.422201 -1.000000
2 -1.000000 0.669050 0.471868 -1.000000 0.684934
3 0.949863 0.608455 0.457862 0.452629 0.954808
3. 層次化索引
- 在某個方向上擁有多個(兩個及兩個以上)索引級別
- 通過層次化索引,pandas能夠以低維度形式處理高維度資料
- 通過層次化索引,可以按層級統計資料
3.1 Series
data = pd.Series(
[988, 95743, 12324, 345, 1299],
index = [
['2001', '2001', '2001', '2002', '2002', ],
['A', 'B','C','A','B']
]
)
data.index.names = ["年份", "類別"]
print(data, end='\n\n')
print(data['2001'], end='\n\n')
print(data[:,'A'], end='\n\n')
輸出
年份 類別
2001 A 988
B 95743
C 12324
2002 A 345
B 1299
dtype: int64
類別
A 988
B 95743
C 12324
dtype: int64
年份
2001 988
2002 345
dtype: int64
3.2 DataFrame
df = pd.DataFrame({'a':range(7),'b':range(7,0,-1),
'c':['one','one','one','two','two','two','two'],
'd':[0,1,2,0,1,2,3]})
print(df.set_index(['c', 'd']), end='\n\n')
print(df[df['c'] == 'one'], end='\n\n')
輸出
a b
c d
one 0 0 7
1 1 6
2 2 5
two 0 3 4
1 4 3
2 5 2
3 6 1
a b c d
0 0 7 one 0
1 1 6 one 1
2 2 5 one 2