小白學 Python 數據分析(10):Pandas (九)數據運算

人生苦短,我用 Pythonpython

前文傳送門:git

小白學 Python 數據分析(1):數據分析基礎github

小白學 Python 數據分析(2):Pandas (一)概述微信

小白學 Python 數據分析(3):Pandas (二)數據結構 Series網絡

小白學 Python 數據分析(4):Pandas (三)數據結構 DataFrame數據結構

小白學 Python 數據分析(5):Pandas (四)基礎操做(1)查看數據函數

小白學 Python 數據分析(6):Pandas (五)基礎操做(2)數據選擇spa

小白學 Python 數據分析(7):Pandas (六)數據導入.net

小白學 Python 數據分析(8):Pandas (七)數據預處理code

小白學 Python 數據分析(9):Pandas (八)數據預處理(2)

引言

前面咱們介紹了不少關於 Pandas 的基礎操做以及拿到一份數據後首先要作的是對數據的基礎預處理。

本篇咱們接着介紹當咱們處理完數據後,能夠對數據進行的一些計算操做。

本篇文章使用的數據爲泰坦尼克的數據集,具體的數據集已經上傳至代碼倉庫,有須要的同窗能夠自行取用。

數據來源是著名的 Kaggle :https://www.kaggle.com/ 。

國內的網絡訪問有些慢,建議本身想辦法,實在不行,能夠加小編微信,小編有個神奇的軟件,特別好用。

在正文內容開始前,小編先把數據中的表名的中英文對照列出來:

  • PassengerId : 乘客ID
  • Survived : 是否倖存
  • Pclass : 乘客等級(1/2/3等艙位)
  • Name : 姓名
  • Sex : 性別
  • Age : 年齡
  • SibSp : 堂兄弟/妹個數
  • Parch : 父母與小孩個數
  • Ticket : 船票信息
  • Fare : 票價
  • Cabin : 客艙
  • Embarked : 登船港口

預處理

首先,咱們拿到數據的第一步是先檢查一下數據質量,經過方法 info() 看下有數據質量:

import pandas as pd

# 數據導入
data_train = pd.read_csv("train.csv")
# 數據查看
print(data_train.info())

# 輸出內容
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
None複製代碼

上面這些數據到底說了個啥?

看過我前面文章的同窗應該知道,info() 這個方法常常用做查看數據空值,很不辛,這裏有些屬性的數據不全,如:

  • Age(年齡)屬性只有714名乘客有記錄
  • Cabin(客艙)更是隻有204名乘客是已知的

這裏咱們進一步使用 describe() 看下這批數據的統計分析數據:

print(data_train.describe())

# 輸出內容
       PassengerId    Survived      Pclass         Age       SibSp  \
count   891.000000  891.000000  891.000000  714.000000  891.000000   
mean    446.000000    0.383838    2.308642   29.699118    0.523008   
std     257.353842    0.486592    0.836071   14.526497    1.102743   
min       1.000000    0.000000    1.000000    0.420000    0.000000   
25%     223.500000    0.000000    2.000000   20.125000    0.000000   
50%     446.000000    0.000000    3.000000   28.000000    0.000000   
75%     668.500000    1.000000    3.000000   38.000000    1.000000   
max     891.000000    1.000000    3.000000   80.000000    8.000000   

            Parch        Fare  
count  891.000000  891.000000  
mean     0.381594   32.204208  
std      0.806057   49.693429  
min      0.000000    0.000000  
25%      0.000000    7.910400  
50%      0.000000   14.454200  
75%      0.000000   31.000000  
max      6.000000  512.329200  複製代碼

能看出來啥呢?

若是把目光聚焦在 mean 這一行上,能夠看到大概 0.383838 的人最後獲救了,在 2 / 3 等倉的人要比 1 等倉的多得多(這不是廢話),平均年齡大概是 29.699118 (這個值計算的時候會忽略掉空值)等等。

算數運算

emmmmmmmmmm,寫到這裏小編髮現個問題,用這份數據演示算數運算屬實有點不大合適,滿臉尷尬。

小編這麼懶的人都寫到這了,確定是不會換數據集了,各位看官就這麼湊合着看吧,先聲明一下,如下演示均無實際意義。

這一小節的標題是算數運算,那無非是加減乘除嘛,首先來看下兩列相加的示例,這裏是把堂兄弟姐妹和父母小孩加在一塊兒,結果稍微有點意義,這個乘客的全部親屬:

print(data_train['SibSp'] + data_train['Parch'])

# 輸出內容
0      1
1      1
2      0
3      1
4      0
      ..
886    0
887    0
888    3
889    0
890    0
Length: 891, dtype: int64複製代碼

兩列相減,這裏咱們使用這個乘客的全部親屬再加上他自己減去存活人數,示例以下:

print(data_train['SibSp'] + data_train['Parch'] + 1 - data_train['Survived'])

# 輸出內容
0      2
1      1
2      0
3      1
4      1
      ..
886    1
887    0
888    4
889    0
890    1
Length: 891, dtype: int64複製代碼

乘除同理,小編這裏就不演示,各位同窗能夠本身動手試試。

比較

這裏咱們選用存活數和親屬數量作比較,幾個簡單的示例:

print(data_train['Survived'] > (data_train['SibSp'] + data_train['Parch']))

# 輸出內容
0      False
1      False
2       True
3      False
4      False
       ...  
886    False
887     True
888    False
889     True
890    False
Length: 891, dtype: bool複製代碼

同理,這裏除了可使用 > 還可使用 >=!=<<=< code=""> 等運算符。

統計分析

前面咱們使用 describe() 這個方法自動的獲取過當前數據集的一些統計數據,那麼咱們如何手動的來獲取它呢?

統計非空值

首先是 count() 統計非空值:

# 按列統計
print(data_train.count())

# 輸出內容
PassengerId    891
Survived       891
Pclass         891
Name           891
Sex            891
Age            714
SibSp          891
Parch          891
Ticket         891
Fare           891
Cabin          204
Embarked       889
dtype: int64

# 按行統計
print(data_train.count(axis=1))

# 輸出內容
0      11
1      12
2      11
3      12
4      11
       ..
886    11
887    12
888    10
889    12
890    11
Length: 891, dtype: int64

# 某一列單獨統計
print(data_train['Age'].count())

# 輸出內容
714複製代碼

求和

接下來是求和, sum 這個函數想必各位都在 Excel 中用過,那麼在 Pandas 中是如何使用的,請看下面的示例:

# 按列求和
print(data_train.sum())

# 輸出內容
PassengerId                                               397386
Survived                                                     342
Pclass                                                      2057
Name           Braund, Mr. Owen HarrisCumings, Mrs. John Brad...
Sex            malefemalefemalefemalemalemalemalemalefemalefe...
Age                                                      21205.2
SibSp                                                        466
Parch                                                        340
Ticket         A/5 21171PC 17599STON/O2. 31012821138033734503...
Fare                                                     28693.9
dtype: object

# 按行求和
print(data_train.sum(axis=1))

# 輸出內容
0       34.2500
1      114.2833
2       40.9250
3       95.1000
4       51.0500
         ...   
886    929.0000
887    939.0000
888    918.4500
889    948.0000
890    933.7500
Length: 891, dtype: float64複製代碼

能夠看到,在進行按列求和的時候, Pandas 把非數值類型的列直接將全部的字段拼合在了一塊兒,其實無太大意義。

求算數平均值

接下來是求算數平均值,這個函數是 mean() ,算數平均值有一個特色是極易受到極大極小值的影響,就好比我和小馬哥的資產平均超過了 100 億,這個其實和我基本上沒有半毛錢關係。

print(data_train.mean())

# 輸出內容
PassengerId    446.000000
Survived         0.383838
Pclass           2.308642
Age             29.699118
SibSp            0.523008
Parch            0.381594
Fare            32.204208
dtype: float64複製代碼

mean() 實際是上對每一列進行了求平均值的運算,實際上能夠經過 axis 參數按行獲取平均值,不過在當前的數據集毫無心義,小編這裏就不演示了。

求最大最小值

接下來是求最大最小值,在 Excel 其實能夠直接經過排序來直觀的看到某一列的最大最小值,那麼,一塊兒看一下在 Pandas 是如何獲取這兩個值:

print(data_train.max())
print('------------------------')
print(data_train.min())

# 輸出內容
PassengerId                            891
Survived                                 1
Pclass                                   3
Name           van Melkebeke, Mr. Philemon
Sex                                   male
Age                                     80
SibSp                                    8
Parch                                    6
Ticket                           WE/P 5735
Fare                               512.329
dtype: object
--------------------------------------------
PassengerId                      1
Survived                         0
Pclass                           1
Name           Abbing, Mr. Anthony
Sex                         female
Age                           0.42
SibSp                            0
Parch                            0
Ticket                      110152
Fare                             0
dtype: object複製代碼

能夠看到,在 Pandas 中獲取最大最小值是使用了兩個函數, max()min() ,經過字面意思你們也懂,這裏一樣要提一下是默認是按照列來獲取最大最小值,若是有須要,也能夠經過參數 axis 來按照行來獲取。

中位數

相比較前面提到過的算數平均數,中位數是一個很是不錯的反應一組數據的通常狀況的一個數據,不易受到極大值和極小值的影響。

在 Pandas 中,獲取中位數是使用 median() 函數:

print(data_train.median())

# 輸出內容
PassengerId    446.0000
Survived         0.0000
Pclass           3.0000
Age             28.0000
SibSp            0.0000
Parch            0.0000
Fare            14.4542
dtype: float64複製代碼

一樣, median() 函數也能夠經過 axis 參數來按照行進行獲取。

衆數

衆數就是出現次數最多的那個數,這裏咱們使用到的函數是 mode()

print(data_train.mode())

# 輸出內容
   Survived  Pclass   Sex   Age  SibSp  Parch  Fare Embarked
0         0       3  male  24.0      0      0  8.05        S 

[891 rows x 12 columns]

# 單獨獲取某列衆數
print(data_train['Sex'].mode())

# 輸出內容
0    male
dtype: object複製代碼

方差標準差

方差和標準差其實都是用來表示數據的離散程度,標準差是方差的平方根。

在 Pandas 中,計算方差是使用 var() 函數,而計算標準差是使用 std() 函數:

print(data_train.var())

# 輸出內容
PassengerId    66231.000000
Survived           0.236772
Pclass             0.699015
Age              211.019125
SibSp              1.216043
Parch              0.649728
Fare            2469.436846
dtype: float64

print(data_train.std())

# 輸出內容
PassengerId    257.353842
Survived         0.486592
Pclass           0.836071
Age             14.526497
SibSp            1.102743
Parch            0.806057
Fare            49.693429
dtype: float64複製代碼

各位閒着沒事兒的同窗能夠覈實一下把標準差平方一下看看是否是方差。

反正小編怕翻車,是專門覈實了一下,確實沒有問題,若是哪位同窗覈實出來有問題,多是小編這臺電腦有問題。

求分位數

分位數是一種比中位數更加詳細的根據位置的指標,在統計學中,最經常使用的是四分位數:

  • 第一四分位數(Q1),又稱「較小四分位數」,等於該樣本中全部數值由小到大排列後第 25% 的數字;
  • 第二四分位數(Q2),又稱「中位數」,等於該樣本中全部數值由小到大排列後第 50% 的數字;
  • 第三四分位數(Q3),又稱「較大四分位數」,等於該樣本中全部數值由小到大排列後第 75% 的數字。

在 Pandas 中,獲取分位數是使用 quantile() 函數,可是在使用的過程當中,必定要標識清楚去的分位數值:

print(data_train.quantile(0.25))
print('-----------------------------------------')
print(data_train.quantile(0.5))

# 輸出內容
PassengerId    223.5000
Survived         0.0000
Pclass           2.0000
Age             20.1250
SibSp            0.0000
Parch            0.0000
Fare             7.9104
Name: 0.25, dtype: float64
-----------------------------------------
PassengerId    446.0000
Survived         0.0000
Pclass           3.0000
Age             28.0000
SibSp            0.0000
Parch            0.0000
Fare            14.4542
Name: 0.5, dtype: float64複製代碼

這裏的驗證能夠對比咱們前面取出來的中位數,看下是否一致就好,若是不一致,可能須要換電腦了。

相關性

相關性運算是指兩個事務之間的關聯程度,這裏咱們可使用 corr() 函數來進行相關性運算。

使用方式:

DataFrame.corr(method='pearson', min_periods=1)

參數說明:

method:可選值爲 {'pearson', 'kendall', 'spearman'}

  • pearson:Pearson相關係數來衡量兩個數據集合是否在一條線上面,即針對線性數據的相關係數計算,針對非線性數據便會有偏差。
  • kendall:用於反映分類變量相關性的指標,即針對無序序列的相關係數,非正太分佈的數據
  • spearman:非線性的,非正太分析的數據的相關係數

咱們通常比較經常使用的是皮爾遜相關係數:

print(data_train.corr(method='pearson'))

# 輸出內容
             PassengerId  Survived    Pclass       Age     SibSp     Parch  \
PassengerId     1.000000 -0.005007 -0.035144  0.036847 -0.057527 -0.001652   
Survived       -0.005007  1.000000 -0.338481 -0.077221 -0.035322  0.081629   
Pclass         -0.035144 -0.338481  1.000000 -0.369226  0.083081  0.018443   
Age             0.036847 -0.077221 -0.369226  1.000000 -0.308247 -0.189119   
SibSp          -0.057527 -0.035322  0.083081 -0.308247  1.000000  0.414838   
Parch          -0.001652  0.081629  0.018443 -0.189119  0.414838  1.000000   
Fare            0.012658  0.257307 -0.549500  0.096067  0.159651  0.216225   

                 Fare  
PassengerId  0.012658  
Survived     0.257307  
Pclass      -0.549500  
Age          0.096067  
SibSp        0.159651  
Parch        0.216225  
Fare         1.000000 複製代碼

本篇內容是真的有點長,各位慢慢看吧,小編就先溜了~~~

示例代碼

老規矩,全部的示例代碼都會上傳至代碼管理倉庫 Github 和 Gitee 上,方便你們取用。

示例代碼-Github

示例代碼-Gitee

參考

https://baike.baidu.com/item/%E5%88%86%E4%BD%8D%E6%95%B0/10064158?fr=aladdin

https://blog.csdn.net/walking_visitor/article/details/85128461

若是個人文章對您有幫助,請掃碼關注下做者的公衆號:獲取最新干貨推送:)
相關文章
相關標籤/搜索