Educoder python Pandas进阶 第1关:Pandas分组聚合

  • 任务描述
  • 相关知识
    • 分组
      • 单列和多列分组
      • Series系列分组
      • 通过数据类型或者字典分组
      • 获取单个分组
      • 对分组进行迭代
    • 聚合
      • 应用单个聚合函数
      • 应用多个聚合函数
      • 自定义函数传入agg()中
      • 对不同的列使用不同的聚合函数
  • 编程要求
  • 测试说明

任务描述

本关任务:使用Pandas加载drinks.csv文件中的数据,根据数据信息求每个大洲红酒消耗量的最大值与最小值的差以及啤酒消耗量的和。

相关知识

分组聚合的流程主要有三步:

  • 分割步骤将DataFrame按照指定的键分割成若干组;

  • 应用步骤对每个组应用函数,通常是累计、转换或过滤函数;

  • 组合步骤将每一组的结果合并成一个输出数组。

Educoder python Pandas进阶 第1关:Pandas分组聚合_第1张图片

分组

通常我们将数据分成多个集合的操作称之为分组,Pandas中使用groupby()函数来实现分组操作。

单列和多列分组

对分组后的子集进行数值运算时,不是数值的列会自动过滤

 
  1. import pandas as pd
  2. data = {'A': [1, 2, 2, 3, 2, 4],
  3. 'B': [2014, 2015, 2014, 2014, 2015, 2017],
  4. 'C': ["a", "b", "c", "d", "e", "f"],
  5. 'D': [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]
  6. }
  7. df = pd.DataFrame(data)
  8. df.groupby("B") #单列分组 返回的是一个groupby对象
  9. df.groupby(["B","C"]) #多列分组

Series系列分组

选取数据帧中的一列作为index进行分组:

 
  1. df["A"].groupby(df["B"]) #df的 A 列根据 B 进行分组

通过数据类型或者字典分组

数据类型分组:

 
  1. df.groupby(df.dtypes,axis=1) # axis=1表示按列分组,以数据类型为列名

传入字典分组:

 
  1. dic = {"A": "number", "B": "number", "C": "str", "D": "number"}
  2. df.groupby(dic, axis=1) #按列分组,列名是字典的值

获取单个分组

使用get_group()方法可以选择一个组。

 
  1. df.groupby("A").get_group(2)

输出:

 
  1. A B C D
  2. 1 2 2015 b 0.9
  3. 2 2 2014 c 2.1
  4. 4 2 2015 e 0.5

对分组进行迭代

GroupBy对象支持迭代,可以产生一组二元元组(由分组名和数据块组成)。

 
  1. for name,data in df.groupby("A"):
  2. print(name)
  3. print(data)

输出:

 
  1. 1
  2. A B C D
  3. 0 1 2014 a 0.5
  4. 2
  5. A B C D
  6. 1 2 2015 b 0.9
  7. 2 2 2014 c 2.1
  8. 4 2 2015 e 0.5
  9. 3
  10. A B C D
  11. 3 3 2014 d 1.5
  12. 4
  13. A B C D
  14. 5 4 2017 f 0.1

聚合

聚合函数为每个组返回单个聚合值。当创建了groupby对象,就可以对分组数据执行多个聚合操作。比较常用的是通过聚合函数或等效的agg方法聚合。常用的聚合函数如下表:

函数名 说明
count 分组中非空值的数量
sum 非空值的和
mean 非空值的平均值
median 非空值的中位数
std、var 无偏标准差和方差
min、max 非空值的最小和最大值
prod 非空值的积
first、last 第一个和最后一个非空值

应用单个聚合函数

对分组后的子集进行数值运算时,不是数值的列会自动过滤

 
  1. import pandas as pd
  2. import numpy as np
  3. data = {'A': [1, 2, 2, 3, 2, 4],
  4. 'B': [2014, 2015, 2014, 2014, 2015, 2017],
  5. 'C': ["a", "b", "c", "d", "e", "f"],
  6. 'D': [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]
  7. }
  8. df = pd.DataFrame(data)
  9. df.groupby("B").sum() #对分组进行求和

应用多个聚合函数

 
  1. df.groupby("B").agg([np.sum,np.mean,np.std])

自定义函数传入agg()中

 
  1. def result(df):
  2. return df.max() - df.min()
  3. df.groupby("B").agg(result) #求每一组最大值与最小值的差

对不同的列使用不同的聚合函数

 
  1. mapping = {"A":np.sum,"B":np.mean}
  2. df.groupby("C").agg(mapping)

编程要求

使用Pandas中的read_csv()函数读取step1/drinks.csv中的数据,数据的列名如下表所示,请根据continent分组并求每个大洲红酒消耗量的最大值与最小值的差以及啤酒消耗量的和。在右侧编辑器begin-end处补充代码。

列名 说明
country 国家名
beer_servings 啤酒消耗量
spirit_servings 白酒消耗量
wine_servings 红酒消耗量
total_litres_of_pure_alcohol 纯酒精总量
continent 大洲名

测试说明

平台会对你编写的代码进行测试:

测试输入:

预期输出:

 
  1. wine_servings beer_servings
  2. continent
  3. Africa 233 3258
  4. Asia 123 1630
  5. Europe 370 8720
  6. North America 99 3345
  7. Oceania 212 1435
  8. South America 220 2101
import pandas as pd
import numpy as np
'''
返回最大值与最小值的和
'''
def sub(df):
    ######## Begin #######
    return df.max() - df.min()
    ######## End #######
def main():
    ######## Begin #######
    data = pd.read_csv("step1/drinks.csv")
    df = pd.DataFrame(data)
    mapping = {"wine_servings":sub,"beer_servings":np.sum}
    print(df.groupby("continent").agg(mapping))
    ######## End #######
if __name__ == '__main__':
    main()

 

你可能感兴趣的:(Educoder编程题答案解析)