Pandas 进阶

第1关:Pandas 分组聚合

任务描述

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

相关知识

为了完成本关任务,你需要掌握:

  1. 分组;
  2. 聚合。

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

  • 分割步骤将 DataFrame 按照指定的键分割成若干组;
  • 应用步骤对每个组应用函数,通常是累计、转换或过滤函数;
  • 组合步骤将每一组的结果合并成一个输出数组。

分组

通常我们将数据分成多个集合的操作称之为分组,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()

第2关:Pandas 创建透视表和交叉表

任务描述

本关任务:使用 Pandas 加载 tip.csv 文件中的数据集,分别用透视表和交叉表统计顾客在每种用餐时间、每个星期下的小费总和情况。

相关知识

为了完成本关任务,你需要掌握:

  1. 透视表;
  2. 交叉表。
透视表

透视表是各种电子表格程序和其他数据分析软件中一种常见的数据汇总工具。它根据一个或多个键对数据进行聚合,并根据行和列上得分组建将数据分配到各个矩形区域中。在 pandas 中,可以通过 pivot_table 函数创建透视表。

pivot_talbe 函数的参数:

 
 
  1. DataFrame.pivot_table(self, values=None, index=None, columns=None,ggfunc='mean', fill_value=None, .margins=False,dropna=True, margins_name='All')
参数名说明
values待聚合的列的名称。默认聚合所有数值列
index用于分组的列名或其他分组键,出现在结果透视表的行
columns用于分组的列名或其他分组键,出现在结果透视表的列
aggfunc聚合函数或函数列表,默认为mean,可以是任何对groupby有效的函数
fill_value用于替换结果表中的缺失值
dropnaboolean值,默认为True
margins_namestring,默认为‘ALL’,当参数margins为True时,ALL行和列的名字

示例:

 
 
  1. data = {'A': [1, 2, 2, 3, 2, 4],
  2. 'B': [2014, 2015, 2014, 2014, 2015, 2017],
  3. 'C': ["a", "b", "c", "d", "e", "f"],
  4. 'D': [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]
  5. }
  6. df = pd.DataFrame(data)
  7. df.pivot_table(index=["B"], columns=["C"], values=["A"], aggfunc=sum, margins=True)

输出:

 
 
  1. A
  2. C a b c d e f All
  3. B
  4. 2014 1.0 NaN 2.0 3.0 NaN NaN 6
  5. 2015 NaN 2.0 NaN NaN 2.0 NaN 4
  6. 2017 NaN NaN NaN NaN NaN 4.0 4
  7. All 1.0 2.0 2.0 3.0 2.0 4.0 14
交叉表

交叉表是一种用于计算分组频率的特殊透视表。通常使用 crosstab 函数来创建交叉表。

crosstab 的参数

 
 
  1. pd.crosstab(index,columns,values=None,rownames=None
  2. colnames=None,aggfunc=None,margins=False,dropna=True,normalize=False)

其中 rownames 可以设置行名,colnames 可以设置列名,而且前两个参数可以是数组、Series 或数组列表。

示例:

 
 
  1. data = {'A': [1, 2, 2, 3, 2, 4],
  2. 'B': [2014, 2015, 2014, 2014, 2015, 2017],
  3. 'C': ["a", "b", "c", "d", "e", "f"],
  4. 'D': [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]
  5. }
  6. df = pd.DataFrame(data)
  7. pd.crosstab(index=[df["B"],df["A"]], columns=df["C"], values=df["A"], aggfunc=sum, margins=True)

输出:

 
 
  1. C a b c d e f All
  2. B A
  3. 2014 1 1.0 NaN NaN NaN NaN NaN 1
  4. 2 NaN NaN 2.0 NaN NaN NaN 2
  5. 3 NaN NaN NaN 3.0 NaN NaN 3
  6. 2015 2 NaN 2.0 NaN NaN 2.0 NaN 4
  7. 2017 4 NaN NaN NaN NaN NaN 4.0 4
  8. All 1.0 2.0 2.0 3.0 2.0 4.0 14

编程要求

使用 Pandas 中的 read_csv 函数加载 step2/tip.csv 文件中的数据集,分别用透视表和交叉表统计顾客在每种用餐时间(time)每个星期下(day)小费(tip)总和情况。在右侧编辑器 Begin-End 内补充代码。

数据集列名信息如下表:

列名说明
total_bill消费总账单
tip小费金额
day消费日期(星期几)
time用餐时间段(早、中、晚)
size吸烟数量

测试说明

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

测试输入:无; 预期输出:

 
 
  1. 透视表:
  2. tip
  3. time Dinner Lunch All
  4. day
  5. Fri 35.28 16.68 51.96
  6. Sat 260.40 NaN 260.40
  7. Sun 247.39 NaN 247.39
  8. Thur 3.00 168.83 171.83
  9. All 546.07 185.51 731.58
  10. 交叉表:
  11. time Dinner Lunch All
  12. day
  13. Fri 35.28 16.68 51.96
  14. Sat 260.40 NaN 260.40
  15. Sun 247.39 NaN 247.39
  16. Thur 3.00 168.83 171.83
  17. All 546.07 185.51 731.58
代码:
#-*- coding: utf-8 -*-
import pandas as pd

#创建透视表
def create_pivottalbe(data):
    ###### Begin ######
    return data.pivot_table(index=["day"],values=["tip"],columns=["time"],margins=True,aggfunc=sum)
    ###### End ######

#创建交叉表
def create_crosstab(data):
    ###### Begin ######
    return pd.crosstab(index=[data.day],columns=[data.time],values=data.tip,aggfunc=sum ,margins=True)
    ###### End ######

def main():
    #读取csv文件数据并赋值给data
    ###### Begin ######
    data = pd.read_csv("step2/tip.csv")
    ###### End ######
    piv_result = create_pivottalbe(data)
    cro_result = create_crosstab(data)
    print("透视表:\n{}".format(piv_result))
    print("交叉表:\n{}".format(cro_result))

if __name__ == '__main__':
    main()







  • 29
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值