• 【DW组队学习—动手学数据分析】第二章:第三节数据重构2


    复习:在前面我们已经学习了Pandas基础,第二章我们开始进入数据分析的业务部分,在第二章第一节的内容中,我们学习了数据的清洗,这一部分十分重要,只有数据变得相对干净,我们之后对数据的分析才可以更有力。而这一节,我们要做的是数据重构,数据重构依旧属于数据理解(准备)的范围。

    开始之前,导入numpy、pandas包和数据
    # 导入基本库
    import numpy as np
    import pandas as pd
    
    • 1
    • 2
    • 3
    # 载入上一个任务保存的文件中:result.csv,并查看这个文件
    result = pd.read_csv("result.csv")
    result.head()
    
    • 1
    • 2
    • 3
    Unnamed: 0PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
    00103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
    11211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
    22313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
    33411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
    44503Allen, Mr. William Henrymale35.0003734508.0500NaNS

    2 第二章:数据重构

    第一部分:数据聚合与运算

    2.6 数据运用

    2.6.1 任务一:通过教材《Python for Data Analysis》P303、Google or anything来学习了解GroupBy机制

    DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, observed=False, dropna=True)
    可以实现数据的分组及组内运算。
    参数:

    • by:mapping, function, label, or list of labels。分组依据。
    • axis:{0 or ‘index’, 1 or ‘columns’}, default 0。沿行 (0) 或列 (1) 拆分。
    • level:int, level name, or sequence of such, default None。如果轴是 MultiIndex(分层),则按特定级别或多个级别分组。
    • as_index:bool, default True。
    • sort:bool, default True。对组键进行排序。关闭此功能可获得更好的性能。请注意,这不会影响每组内的观察顺序。Groupby保留每个组内的行顺序。
    • group_keys:bool, default True。
    • observed:bool, default False。
    • dropna:bool, default False。如果为 True,并且组键包含 NA 值,则 NA 值连同行/列将被删除。如果为 False,NA 值也将被视为组中的键。

    结果:
    带索引的表格

    在groupby方法后可以使用sum、mean等统计方法,进行的是组内运算

    2.4.2:任务二:计算泰坦尼克号男性与女性的平均票价
    # 写入代码
    task2 = result["Fare"].groupby(result["Sex"]).mean()
    task2
    
    • 1
    • 2
    • 3
    Sex
    female    44.479818
    male      25.523893
    Name: Fare, dtype: float64
    
    • 1
    • 2
    • 3
    • 4

    在了解GroupBy机制之后,运用这个机制完成一系列的操作,来达到我们的目的。

    下面通过几个任务来熟悉GroupBy机制。

    2.4.3:任务三:统计泰坦尼克号中男女的存活人数
    # 写入代码
    task3 = result["Survived"].groupby(result["Sex"]).sum()
    task3
    
    • 1
    • 2
    • 3
    Sex
    female    233
    male      109
    Name: Survived, dtype: int64
    
    • 1
    • 2
    • 3
    • 4
    2.4.4:任务四:计算客舱不同等级的存活人数
    # 写入代码
    result["Survived"].groupby(result["Pclass"]).sum()
    
    • 1
    • 2
    Pclass
    1    136
    2     87
    3    119
    Name: Survived, dtype: int64
    
    • 1
    • 2
    • 3
    • 4
    • 5

    提示:】表中的存活那一栏,可以发现如果还活着记为1,死亡记为0

    思考】从数据分析的角度,上面的统计结果可以得出那些结论

    通过任务二可以发现女性乘客的平均票价高于男性
    通过任务三可以发现女性乘客的存活人数高于男性
    通过任务四可以发现1级客舱和3级客舱的存活人数相对较高
    由此猜测,1)是否女性乘客多选择1级客舱或3级客舱?2)是否平均票价高的客舱存活人数也较高?存活率呢?
    通过下面的处理可以看出:1)女性乘客多选择1级客舱或3级客舱;2)1级客舱的票价相对较高,其存活人数最高,存活率也最高;3级客舱的存活人数虽然也较高,但其乘客最多,存活率最低,因此形成易存活的表象

    #查看女性乘客的客舱选择分布
    result[result["Sex"]=="female"]["Sex"].groupby(result["Pclass"]).count()
    
    • 1
    • 2
    Pclass
    1     94
    2     76
    3    144
    Name: Sex, dtype: int64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    #查看不同客舱的平均票价
    result["Fare"].groupby(result["Pclass"]).mean()
    
    • 1
    • 2
    Pclass
    1    84.154687
    2    20.662183
    3    13.675550
    Name: Fare, dtype: float64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    #查看不同客舱的原有人数
    result["PassengerId"].groupby(result["Pclass"]).count()
    
    • 1
    • 2
    Pclass
    1    216
    2    184
    3    491
    Name: PassengerId, dtype: int64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    #查看不同客舱的存活率
    result["Survived"].groupby(result["Pclass"]).sum()/result["PassengerId"].groupby(result["Pclass"]).count()
    
    • 1
    • 2
    Pclass
    1    0.629630
    2    0.472826
    3    0.242363
    dtype: float64
    
    • 1
    • 2
    • 3
    • 4
    • 5

    【思考】从任务二到任务三中,这些运算可以通过agg()函数来同时计算。并且可以使用rename函数修改列名。你可以按照提示写出这个过程吗?

    **DataFrame.agg(func=None, axis=0, *args, kwargs) 或 **GroupBy.agg(func, *args, kwargs)
    在指定轴上使用一个或多个操作进行聚合。

    • 可以对数据同时进行多组聚合操作。df.agg([‘sum’, ‘min’])
    • 可以对不同列数据分别进行不同聚合操作。df.agg({‘A’ : [‘sum’, ‘min’], ‘B’ : [‘min’, ‘max’]})
    • 可以对聚合操作结果进行重命名。df.agg(x=(‘A’, max), y=(‘B’, ‘min’), z=(‘C’, np.mean))

    参数:

    • func:函数、str、list 或 dict。用于聚合数据的函数。
    • axis:{0 或 ‘index’,1 或 ‘columns’},默认 0。按行聚合或按列聚合。

    返回:
    带索引的表格

    #思考心得
    result.groupby(result["Sex"]).agg({"Fare":"mean", "Survived":"sum"}).rename(columns={"Fare":"mean_fare", "Survived":"count_survived"})
    
    • 1
    • 2
    mean_farecount_survived
    Sex
    female44.479818233
    male25.523893109
    2.4.5:任务五:统计在不同等级的票中的不同年龄的船票花费的平均值
    # 写入代码
    result.groupby(["Pclass","Age"])["Fare"].mean()
    
    • 1
    • 2
    Pclass  Age  
    1       0.92     151.5500
            2.00     151.5500
            4.00      81.8583
            11.00    120.0000
            14.00    120.0000
                       ...   
    3       61.00      6.2375
            63.00      9.5875
            65.00      7.7500
            70.50      7.7500
            74.00      7.7750
    Name: Fare, Length: 182, dtype: float64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    2.4.6:任务六:将任务二和任务三的数据合并,并保存到sex_fare_survived.csv
    # 写入代码
    sex_fare_survived = pd.merge(task2, task3, on = "Sex")
    sex_fare_survived
    
    • 1
    • 2
    • 3
    FareSurvived
    Sex
    female44.479818233
    male25.523893109
    sex_fare_survived.to_csv("sex_fare_survived.csv")
    
    • 1
    2.4.7:任务七:得出不同年龄的总的存活人数,然后找出存活人数最多的年龄段,最后计算存活人数最高的存活率(存活人数/总人数)
    # 不同年龄的存活人数
    survived_age_num = result["Survived"].groupby(result["Age"]).sum()
    survived_age_num
    
    • 1
    • 2
    • 3
    Age
    0.42     1
    0.67     1
    0.75     2
    0.83     2
    0.92     1
            ..
    70.00    0
    70.50    0
    71.00    0
    74.00    0
    80.00    1
    Name: Survived, Length: 88, dtype: int64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    # 存活人数最多的年龄段
    most_survived_age = survived_age_num[survived_age_num.values == survived_age_num.max()].index[0]
    most_survived_age
    
    • 1
    • 2
    • 3
    24.0
    
    • 1
    #存活人数最高的年龄段的存活率
    human_sum = result["Survived"].sum()
    print("总人数:{}".format(human_sum))
    
    survived_rate = survived_age_num.max()/human_sum
    print(f"存活人数最高的年龄段的存活率:{survived_rate}")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    总人数:342
    存活人数最高的年龄段的存活率:0.043859649122807015
    
    • 1
    • 2
  • 相关阅读:
    块链串的实现(c语言)
    Law of continuity
    33. 搜索旋转排序数组
    【Matlab】二维绘图函数汇总
    VS使用ImageMagick++库建立图像
    [ 基础漏洞篇 ] webpack 前端源码泄露详解
    母婴广告投放在哪里合适?如何在抖音投放广告抢占市场?
    springboot心灵治愈交流平台源码和论文
    MySQL 开启SSL无效问题
    Podman Desktop安装与使用-Windows10
  • 原文地址:https://blog.csdn.net/sinat_33209811/article/details/126912057