任务描述
本关任务:使用Pandas加载drinks.csv文件中的数据,根据数据信息求每个大洲红酒消耗量的最大值与最小值的差以及啤酒消耗量的和。
相关知识
*分组聚合的流程主要有三步:
- 分割步骤将DataFrame按照指定的键分割成若干组;
- 应用步骤对每个组应用函数,通常是累计、转换或过滤函数;
- 组合步骤将每一组的结果合并成一个输出数组。*

分组
通常我们将数据分成多个集合的操作称之为分组,Pandas中使用groupby()函数来实现分组操作。
单列和多列分组
对分组后的子集进行数值运算时,不是数值的列会自动过滤
import pandas as pd
data = {'A': [1, 2, 2, 3, 2, 4],
'B': [2014, 2015, 2014, 2014, 2015, 2017],
'C': ["a", "b", "c", "d", "e", "f"],
'D': [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]
}
df = pd.DataFrame(data)
df.groupby("B") #单列分组 返回的是一个groupby对象
df.groupby(["B","C"]) #多列分组
Series系列分组
选取数据帧中的一列作为index进行分组:
df["A"].groupby(df["B"]) #df的 A 列根据 B 进行分组
通过数据类型或者字典分组
数据类型分组:
df.groupby(df.dtypes,axis=1) # axis=1表示按列分组,以数据类型为列名
传入字典分组:
dic = {"A": "number", "B": "number", "C": "str", "D": "number"}
df.groupby(dic, axis=1) #按列分组,列名是字典的值
获取单个分组
使用get_group()方法可以选择一个组。
df.groupby("A").get_group(2)
输出:
A B C D
1 2 2015 b 0.9
2 2 2014 c 2.1
4 2 2015 e 0.5
对分组进行迭代
GroupBy对象支持迭代,可以产生一组二元元组(由分组名和数据块组成)。
for name,data in df.groupby("A"):
print(name)
print(data)
输出:
1
A B C D
0 1 2014 a 0.5
2
A B C D
1 2 2015 b 0.9
2 2 2014 c 2.1
4 2 2015 e 0.5
3
A B C D
3 3 2014 d 1.5
4
A B C D
5 4 2017 f 0.1
聚合
聚合函数为每个组返回单个聚合值。当创建了groupby对象,就可以对分组数据执行多个聚合操作。比较常用的是通过聚合函数或等效的agg方法聚合。常用的聚合函数如下表:
| 函数名 | 说明 |
|---|---|
| count | 分组中非空值的数量 |
| sum | 非空值的和 |
| mean | 非空值的平均值 |
| median | 非空值的中位数 |
| std、var | 无偏标准差和方差 |
| min、max | 非空值的最小和最大值 |
| prod | 非空值的积 |
| first、last | 第一个和最后一个非空值 |
应用单个聚合函数
对分组后的子集进行数值运算时,不是数值的列会自动过滤
import pandas as pd
import numpy as np
data = {'A': [1, 2, 2, 3, 2, 4],
'B': [2014, 2015, 2014, 2014, 2015, 2017],
'C': ["a", "b", "c", "d", "e", "f"],
'D': [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]
}
df = pd.DataFrame(data)
df.groupby("B").sum() #对分组进行求和
应用多个聚合函数
df.groupby("B").agg([np.sum,np.mean,np.std])
自定义函数传入agg()中
def result(df):
return df.max() - df.min()
df.groupby("B").agg(result) #求每一组最大值与最小值的差
对不同的列使用不同的聚合函数
mapping = {"A":np.sum,"B":np.mean}
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 | 大洲名 |
| 测试说明 | |
| 平台会对你编写的代码进行测试: |
测试输入:
预期输出:
wine_servings beer_servings
continent
Africa 233 3258
Asia 123 1630
Europe 370 8720
North America 99 3345
Oceania 212 1435
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",header = 0)#读取数据
df = pd.DataFrame(data)#转换为Pandas DataFrame 数据
mapping = {"wine_servings":sub,"beer_servings":np.sum}
print(df.groupby("continent").agg(mapping))#根据continet分组,并使用不同的聚合函数
######## End #######
if __name__ == '__main__':
main()
本篇博客主要介绍了如何使用Pandas进行数据分组和聚合操作,以解决计算每个大洲红酒消耗量最大值与最小值之差及啤酒消耗量总和的任务。首先讲解了分组聚合的三步流程,然后详细阐述了Pandas的groupby()函数,包括单列、多列分组,Series分组以及数据类型的分组方式。此外,还提到了如何获取特定分组和对分组进行迭代。最后,介绍了聚合函数的应用,包括单个和多个聚合函数的使用,以及自定义函数在agg()方法中的应用,并给出了一个实际编程任务,要求根据continent分组计算酒类消耗统计。
1391

被折叠的 条评论
为什么被折叠?



