1.数据分组统计
1.1分组统计groupby函数
对数据进行分组统计,主要使用DataFrame对象的groupby函数,功能如下:
(一)根据给定的条件将数据拆分成组。
(二)每个组都可以独立应用函数(如求和函数(sum)、求平均值函数(mean)等)
(三)将结果合并到一个数据结构中。
语法如下:
DataFrame.groupby(by=None,axis=0,level=None,as_index=True,sort=True,group_keys=True,squeeze=False,observed=False)
by:如果by是一个函数,则对象索引的每个值调用它。如果传递了一个字典或Series对象,则使用该字典或 Series对象值来确定组。如果传递了数组ndarray,则按原样使用这些值来确定值。
axis:axis=1表示行,axis=0表示行,默认值为0。
as_index:布尔型,默认为True,返回以组标签为索引的对象。
group_keys:布尔型,默认为True,调用apply函数时,将分组的键添加到索引以标识片段。
squeeze:布尔型,默认为False,如果可能,减少返回类型的维度,否则返回一致类型。
1.1.1按照一列分组统计
import pandas as pd
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
pd.set_option('display.unicode.east_asian_width', True)
df=pd.read_csv('JD.csv',encoding='gbk')
df1 = df[['一级分类', '7天点击量', '订单预定']]
print(df1.groupby('一级分类').sum())
输出结果
7天点击量 订单预定 一级分类 数据库 186 15 移动开发 261 7 编程语言与程序设计 4280 192 网页制作/Web技术 345 15
1.1.2按照多列分组统计
df1 = df[['一级分类', '二级分类', '7天点击量', '订单预定']] print(df1.groupby(['一级分类', '二级分类']).sum())
输出结果
7天点击量 订单预定
一级分类 二级分类
数据库 Oracle 58 2
SQL 128 13
移动开发 Android 261 7
编程语言与程序设计 ASP.NET 87 2
C# 314 12
C++/C语言 724 28
JSP/JavaWeb 157 1
Java 408 16
PHP 113 1
Python 2449 132
Visual Basic 28 0
网页制作/Web技术 HTML 188 8
JavaScript 100 7
WEB前端 57 0
1.1.3分组并按指定列进行数据计算
print(df1.groupby('二级分类')['7天点击量'].sum())
输出结果
二级分类 ASP.NET 87 Android 261 C# 314 C++/C语言 724 HTML 188 JSP/JavaWeb 157 Java 408 JavaScript 100 Oracle 58 PHP 113 Python 2449 SQL 128 Visual Basic 28 WEB前端 57
1.2对分组数据进行迭代
通过for循环对分组统计数据进行迭代
for name, group in df1.groupby('一级分类'):
print(name)
print(group)
输出结果
数据库
一级分类 7天点击量 订单预定
25 数据库 58 2
27 数据库 128 13
移动开发
一级分类 7天点击量 订单预定
10 移动开发 85 4
19 移动开发 32 1
24 移动开发 85 2
28 移动开发 59 0
编程语言与程序设计
一级分类 7天点击量 订单预定
0 编程语言与程序设计 35 1
1 编程语言与程序设计 49 0
2 编程语言与程序设计 51 2
3 编程语言与程序设计 64 1
4 编程语言与程序设计 26 0
5 编程语言与程序设计 60 1
6 编程语言与程序设计 227 11
...
网页制作/Web技术
一级分类 7天点击量 订单预定
7 网页制作/Web技术 100 7
14 网页制作/Web技术 188 8
17 网页制作/Web技术 57 0
上述代码中的name是groupby中“一级分类”的值,group是分组后的数据。如果groupby对多列进行分组,那么需要再for循环中指定多列
df1 = df[['一级分类', '二级分类', '7天点击量', '订单预定']]
for (key1, key2), group in df1.groupby(['一级分类', '二级分类']):
print(key1, key2)
print(group)
1.3对分组的某列或多列使用聚合函数(agg函数)
对分组统计结果使用聚合函数
按“一级分类”分组统计“7天点击量”和“订单预定”的平均值总和
print(df1.groupby('一级分类').agg(['mean', 'sum']))
输出结果
7天点击量 订单预定
mean sum mean sum
一级分类
数据库 93.000000 186 7.50 15
移动开发 65.250000 261 1.75 7
编程语言与程序设计 178.333333 4280 8.00 192
网页制作/Web技术 115.000000 345 5.00 15
针对不同的列使用不同的聚合函数
例:按“一级分类”分组统计“7天点击量”的平均值和总和一级“订单预定”总和
print(df1.groupby('一级分类').agg({'7天点击量':['mean', 'sum'], '订单预定':['sum']}))
输出结果
7天点击量 订单预定
mean sum sum
一级分类
数据库 93.000000 186 15
移动开发 65.250000 261 7
编程语言与程序设计 178.333333 4280 192
网页制作/Web技术 115.000000 345 15
通过自定义函数实现分组统计
#x是“宝贝标题”对应的列
#value_counts()函数用于Series对象中的每个值进行计数并且排序
max1 = lambda x: x.value_counts(dropna=False).index[0]
max1.__name__ = "购买次数最多"
df1=df.agg({'宝贝标题': [max1],
'数量': ['sum', 'mean'],
'买家实际支付金额': ['sum', 'mean']})
print(df1)
输出结果
宝贝标题 数量 买家实际支付金额 购买次数最多 零基础学Python NaN NaN sum NaN 53.00 2528.5600 mean NaN 1.06 50.5712
1.4通过字典和Series对象进行分组统计
1.4.1通过字典进行分组统计
首先创建字典建立的对应关系,然后将字典传递给groupby函数,从而实现数据分组统计
import pandas as pd #导入pandas模块
#设置数据显示的列数和宽度
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df=pd.read_csv('JD.csv',encoding='gbk') #导入csv文件
df=df.set_index(['商品名称'])
#创建字典
dict1={'上海出库销量':'北上广','北京出库销量':'北上广',
'广州出库销量':'北上广','成都出库销量':'成都',
'武汉出库销量':'武汉','西安出库销量':'西安'}
df1=df.groupby(dict1,axis=1).sum()
print(df1)
输出结果
北上广 成都 武汉 西安 商品名称 零基础学Python(全彩版) 1991 284 246 152 Python从入门到项目实践(全彩版) 798 113 92 63 Python项目开发案例集锦(全彩版) 640 115 88 57 Python编程锦囊(全彩版) 457 85 65 47 零基础学C语言(全彩版) 364 82 63 40 SQL即查即用(全彩版) 305 29 25 40 零基础学Java(全彩版) 238 48 43 29 零基础学C++(全彩版) 223 53 35 23 零基础学C#(全彩版) 146 27 16 7 C#项目开发实战入门(全彩版) 135 18 22 12
1.4.2通过Series对象进行分组统计
通过Series对象进行分组统计是,它与字典的方法类似。
data={'上海出库销量':'北上广','北京出库销量':'北上广',
'广州出库销量':'北上广','成都出库销量':'成都',
'武汉出库销量':'武汉','西安出库销量':'西安',}
s1=pd.Series(data)
print(s1)
df1=df.groupby(s1,axis=1).sum()
print(df1)
输出结果同上



