Pandas进阶(第⼀关,第⼆关)
简介
Pandas是基于NumPy的⼀种⼯具,该⼯具是为了解决数据分析任务⽽创建的。Pandas纳⼊了⼤量库和⼀些标准的数据模型,提供了⾼效地操作⼤型数据集所需的⼯具。Pandas提供了⼤量快速便捷地处理数据的函数和⽅法。使Python成为强⼤⽽⾼效的数据分析环境的重要因素之⼀。
本实训的主要内容是:1.Pandas使⽤分组聚合进⾏组内计算,2.创建透视表和交叉表。本实训需要学员对Pandas的数据结构和统计函数有⼀定的了解。
第1关:Pandas分组聚合
任务描述
相关知识
分组
单列和多列分组
Series系列分组
通过数据类型或者字典分组
获取单个分组
对分组进⾏迭代
聚合
应⽤单个聚合函数
应⽤多个聚合函数
⾃定义函数传⼊agg()中
对不同的列使⽤不同的聚合函数
编程要求
测试说明
任务描述
本关任务:使⽤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)
Series系列分组
选取数据帧中的⼀列作为index进⾏分组:
df[“A”].groupby(df[“B”]) #df的 A 列根据 B 进⾏分组
通过数据类型或者字典分组
数据类型分组:
传⼊字典分组:
dic = {“A”: “number”, “B”: “number”, “C”: “str”, “D”: “number”}
获取单个分组
使⽤get_group()⽅法可以选择⼀个组。
输出:
A B C D
1 2 2015 b 0.9
2 2 2014 c 2.1
4 2 201
5 e 0.5
对分组进⾏迭代
GroupBy对象⽀持迭代,可以产⽣⼀组⼆元元组(由分组名和数据块组成)。
for name,data upby(“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 201
5 e 0.5
3
A B C D
3 3 201
4 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)
应⽤多个聚合函数
⾃定义函数传⼊agg()中
def result(df):
return df.max() - df.min()
对不同的列使⽤不同的聚合函数
mapping = {“A”:np.sum,“B”:np.mean}
编程要求
使⽤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")
df = pd.DataFrame(data)
mapping ={"wine_servings":sub,"beer_servings":np.sum}
upby("continent").agg(mapping))
>### End >##
if __name__ =='__main__':
main()
第2关:Pandas创建透视表和交叉表
任务描述
相关知识
透视表
交叉表
编程要求
测试说明
任务描述
本关任务:使⽤Pandas加载tip.csv⽂件中的数据集,分别⽤透视表和交叉表统计顾客在每种⽤餐时间、每个星期下的⼩费总和情况。
相关知识
透视表
透视表是各种电⼦表格程序和其他数据分析软件中⼀种常见的数据汇总⼯具。它根据⼀个或多个键对数据进⾏聚合,并根据⾏和列上得分组建将数据分配到各个矩形区域中。在pandas中,可以通过pivot_table函数创建透视表。
pivot_talbe函数的参数:
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 ⽤于替换结果表中的缺失值
dropna boolean值,默认为True
margins_name string,默认为‘ALL’,当参数margins为True时,ALL⾏和列的名字
⽰例:
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.pivot_table(index=[“B”], columns=[“C”], values=[“A”], aggfunc=sum, margins=True)
输出:
A
C a b c d e f All
B
2014 1.0 NaN 2.0 3.0 NaN NaN 6
2015 NaN 2.0 NaN NaN 2.0 NaN 4
2017 NaN NaN NaN NaN NaN 4.0 4
All 1.0 2.0 2.0 3.0 2.0 4.0 14
交叉表
交叉表是⼀种⽤于计算分组频率的特殊透视表。通常使⽤crosstab函数来创建交叉表。
crosstab的参数
,colnames=None,aggfunc=None,margins=False,dropna=True,normalize=False)
其中rownames可以设置⾏名,colnames可以设置列名,⽽且前两个参数可以是数组、Series或数组列表。
⽰例:
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)
输出:
C a b c d e f All
B A
2014 1 1.0 NaN NaN NaN NaN NaN 1
2 NaN NaN 2.0 NaN NaN NaN 2
3 NaN NaN NaN 3.0 NaN NaN 3
2015 2 NaN 2.0 NaN NaN 2.0 NaN 4
2017 4 NaN NaN NaN NaN NaN 4.0 4
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 吸烟数量
测试说明
平台会对你编写的代码进⾏测试:
groupby分组
测试输⼊:
预期输出:

发表评论