• python数据分析——分组操作1


    参考资料:活用pandas库

    1、简介

            借助“分割-应用-组合”(split-apply-combine)模式,分组操作可以有效地聚合、转换和过滤数据。

            分割:基于键,把要处理的数据分割为小片段。

            应用:分别处理每个数据片段。

            组合:把处理结果组合成新的数据集

            该模式的强大在于,可以将原始数据分割成独立的片段分别进行处理。pandas的groupby工作方式与sql语言的group by相同。

    2、聚合

            聚合也称“汇总”(summarization),是指某种形式的数据归约。

    (1)基本的单变量分组聚合

    1. # 导入库
    2. import pandas as pd
    3. # 加载Gapminder数据集
    4. df=pd.read_csv(r"...\data\gapminder.tsv",sep='\t')
    5. # 计算每年平均预期寿命
    6. avg_life_exp_by_year=df.groupby('year').lifeExp.mean()
    7. print(avg_life_exp_by_year)

            针对上面的例子,可以认为groupby语句创建了一个子集,里面含有各列的唯一值(或者列的唯一对)。

    (2)pandas内置的聚合方法

    pandas方法numpy/scipy函数说明
    countnp.count_nonezero频率统计(不包含NaN值)
    size频率统计(包含NaN值)
    meannp.mean求平均值
    stdnp.std样本标准差
    minnp.min最小值
    quantile(q=0.25)np.percentile(q=0.25)下四分位数
    quantile(q=0.50)np.percentile(q=0.50)中位数
    quantile(q=0.75)np.percentile(q=0.75)上四分位数
    maxnp.max最大值
    sumnp.sum求和
    varnp.var无偏方差
    semscipy.stats.sem平均数标准误
    describescipy.stats.describe计数、平均数、标准差、25%、50%、75%分位数、最大值
    first返回第一行
    last返回最后一行
    nth返回第n行(python从0开始计数)
    1. # 根据所在的洲分组,针对每个组对预期寿命做汇总统计
    2. continent_describe=df.groupby('continent').lifeExp.describe()
    3. print(continent_describe)

    (3)聚合函数

            除了直接调用聚合方法,还可以调用agg方法或aggregate方法,传入想用的聚合函数。使用agg或aggregate时,需要使用上表中numpy/scipy函数。

    1. # 导入numpy库
    2. import numpy as np
    3. # 计算各洲的平均预期寿命
    4. # 使用np.mean函数
    5. cont_le_agg=df.groupby('continent').lifeExp.agg(np.mean)
    6. print(cont_le_agg)
    7. # agg和aggregate功能相同
    8. cont_le_agg2=df.groupby('continent')['lifeExp'].aggregate(np.mean)
    9. print(cont_le_agg2)

    1. # 自定义函数的聚合
    2. # 创建自定义函数
    3. def my_mean_diff(values,diff_value):
    4. """
    5. 计算平均值和diff_value之差
    6. """
    7. n=len(values)
    8. sum=0
    9. for value in values:
    10. sum+=value
    11. mean=sum/n
    12. return (mean-diff_value)
    13. # 计算全球平均预期寿命的平均值
    14. global_mean=df.lifeExp.mean()
    15. print(global_mean)
    16. # 还有多个参数的自定义聚合函数
    17. agg_mean_diff=df.groupby('continent').lifeExp.\
    18. agg(my_mean_diff,diff_value=global_mean)
    19. print(agg_mean_diff)

    (4)同时传入多个函数

            如果想同时计算多个聚合函数,可以先把他们全部放入一个python列表,然后把整个列表传入agg或aggregate中。这里所用函数仍然是上表中的sumpy/scipy函数。

    1. # 按洲计算lifeExp的非零个数、平均值和标准差
    2. gdf=df.groupby('continent').lifeExp.agg([np.count_nonzero,np.mean,np.std])
    3. print(gdf)

    (5)在agg/aggregate中使用字典

            对于分组的DataFrame指定的dict时,键是DataFrame的列,值是聚合计算使用的函数。这种方法允许对一个或多个变量进行分组,对不同列同时使用不同的聚合函数。

            可以在groupby之后把一个dict传入Series中,直接做汇总统计并将其返回,dict的键是新的列名,这与把dict传入分组的DataFrame时的行为不同,不建议使用。

    1. # 对DataFrame使用字典聚合不同列
    2. # 对于每一年,计算平均值lifeExp、中位数pop和中位数gdfPercap
    3. gdf_dict=df.groupby('year').agg({
    4. "lifeExp":"mean",
    5. "pop":"median",
    6. "gdpPercap":"median"})
    7. print(gdf_dict)

    1. gdf=df.groupby('year')['lifeExp'].\
    2. agg([np.count_nonzero,np.mean,np.std]).\
    3. rename(columns={'count_nonzero':'count',
    4. 'mean':'avg',
    5. 'std':'std_dev'}).\
    6. reset_index() # 返回一个普通DataFrame
    7. print(gdf)

  • 相关阅读:
    ESP32IDF出现Syntax Warning in cmake code at column 47报错
    无服务架构--Serverless
    golang有序map
    html实现邮件模版布局-flex布局&table布局-demo
    学生毕业设计选题管理系统(JSP+MySQL+Eclipse)
    shell编程100例,查缺补漏
    Redis 复习计划 - Redis主从数据一致性和哨兵机制
    java.lang.NoSuchMethodException异常处理方法
    知乎 PB 级别 TiDB 数据库在线迁移实践
    树莓派(七)文件系统及其目录结构、虚拟文件系统
  • 原文地址:https://blog.csdn.net/maizeman126/article/details/139215335