• 小白学 Python 数据分析(10):Pandas (九)数据运算


    人生苦短,我用 Python

    前文传送门:

    小白学 Python 数据分析(1):数据分析基础

    小白学 Python 数据分析(2):Pandas (一)概述

    小白学 Python 数据分析(3):Pandas (二)数据结构 Series

    小白学 Python 数据分析(4):Pandas (三)数据结构 DataFrame

    小白学 Python 数据分析(5):Pandas (四)基础操作(1)查看数据

    小白学 Python 数据分析(6):Pandas (五)基础操作(2)数据选择

    小白学 Python 数据分析(7):Pandas (六)数据导入

    小白学 Python 数据分析(8):Pandas (七)数据预处理

    小白学 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
    

    同理,这里除了可以使用 > 还可以使用 >=!=<<= 等运算符。

    统计分析

    前面我们使用 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/分位数/10064158?fr=aladdin

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

  • 相关阅读:
    pwnable.kr login之write up
    安装ubuntu16.4后
    HTML资源定位器-URL
    【实验吧】编程循环&&求底运算
    【SQL注入】mysql中information_schema详解
    C#之BackgroundWorker从简单入门到深入精通的用法总结
    C#使用NPOI对Excel文档进行读、写、导入、导出等操作的dll最新版2.5.1+2.3.0
    Visual Studio中Debug与Release以及x86、x64、Any CPU的区别
    C# 使用BackgroundWorker例子及注意点
    C# BackgroundWorker组件学习入门介绍
  • 原文地址:https://www.cnblogs.com/babycomeon/p/12400570.html
Copyright © 2020-2023  润新知