1. 程式人生 > 其它 >pandas基本功能 - 彙總和計算描述統計

pandas基本功能 - 彙總和計算描述統計

技術標籤:科學計算pythonpandas

文章目錄

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 ullIsnull的否定式
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