数据分组
数据分组就是根据一个或多个键(可以是函数、数组或df列名)将数据分成若干组,然后对分组后的数据分别进行汇总计算,并将汇总计算后的结果进行合并,被用作汇总计算的函数称为聚合函数。数据分组的具体分组流程如下图所示
在Python中对数据分组利用的是**groupby()**方法:
DataFrame.groupby (by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True,=False, **kwargs)
by :分组字段,接收list、str、mapping或generator,用于确定进行分组的键值。如果传入的是一个函数则对索引进行计算并分组;如果传入的是一个字典或者series则用字典或者series的值作为分组依据;如果传入一个numpy数组则用数据的元素作为分组依据;如果传入的是字符串或者字符串列表则用这些字符串所代表的字段作为分段依据
axis :指定切分方向,默认为0,表示沿着行切分,对列进行操作
level :表示标签所在级别,默认为None
as_index:表示聚合后的聚合标签是否以DataFrame索引形式输出,默认为True;当设置为False时相当于加了reset_index功能
sort :通过sort参数指定是否对输出结果按索引排序,默认为True
group_keys :表示是否显示分组标签的名称,默认为True
squeeze :表示是否在允许的情况下对返回数据进行降维,默认为True
1 分组类型
1.1 分组键是列名
分组键是列名时直接将某一列或多列的列名传给groupby()方法,groupby()方法就会按照这一列或多列进行分组。
1.1.1 按照一列进行分组
import pandas as pd
df = pd.read_excel(r"D:\testdata\data.xlsx")
print(df.head())
print("="*30)
df.info()
实际价格(元) 运费(元) 数量 实际支付(元) 状态 商品SKU信息 省 市 \
0 218.9 0.0 1 218.9 已付款未发货 金色110cm 1个 内蒙古自治区 呼伦贝尔市
1 218.9 0.0 1 218.9 交易关闭 金色120cm 1个 内蒙古自治区 呼伦贝尔市
2 328.9 0.0 1 328.9 交易取消 米白S 1个 山东省 枣庄市
3 218.9 0.0 1 218.9 交易关闭 黑色M 105-120斤 1个 浙江省 嘉兴市
4 185.9 0.0 1 185.9 已付款未发货 黑色L 1个 陕西省 咸阳市
区 会员等级 优惠信息 是否白付美支付 货款退款金额 运费退款金额 退款完成时间
0 新巴尔虎右旗 获取会员信息失败! 无优惠信息 否 0.0 0.0 NaN
1 新巴尔虎右旗 获取会员信息失败! 无优惠信息 否 218.9 0.0 2020-11-12 09:35:43
2 薛城区 获取会员信息失败! 无优惠信息 否 0.0 0.0 NaN
3 桐乡市 获取会员信息失败! 无优惠信息 否 218.9 0.0 2020-11-12 06:37:25
4 杨陵区 获取会员信息失败! 无优惠信息 是 0.0 0.0 NaN
==============================
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 88 entries, 0 to 87
Data columns (total 15 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 实际价格(元) 88 non-null float64
1 运费(元) 88 non-null float64
2 数量 88 non-null int64
3 实际支付(元) 88 non-null float64
4 状态 88 non-null object
5 商品SKU信息 88 non-null object
6 省 88 non-null object
7 市 88 non-null object
8 区 88 non-null object
9 会员等级 88 non-null object
10 优惠信息 88 non-null object
11 是否白付美支付 88 non-null object
12 货款退款金额 88 non-null float64
13 运费退款金额 88 non-null float64
14 退款完成时间 41 non-null object
dtypes: float64(5), int64(1), object(9)
memory usage: 10.4+ KB
df.groupby("状态") # 以状态列分组
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001C9772AE640>
df.groupby("状态").groups # groups属性返回一个字典,包含所有分组子数据帧与索引值
{'交易关闭': Int64Index([ 1, 3, 5, 6, 7, 8, 13, 14, 15, 16, 17, 18, 21, 22, 23, 28, 29,
30, 33, 35, 37, 38, 39, 43, 45, 46, 49, 50, 51, 54, 56, 59, 65, 67,
70, 75, 77, 80, 81, 82, 84],
dtype='int64'),
'交易取消': Int64Index([ 2, 11, 24, 31, 36, 41, 44, 47, 48, 52, 55, 60, 61, 62, 64, 66, 69,
73, 79, 83, 85, 86],
dtype='int64'),
'已付款未发货': Int64Index([ 0, 4, 9, 10, 12, 19, 20, 25, 26, 27, 32, 34, 40, 42, 53, 57, 58,
63, 68, 71, 72, 74, 76, 78],
dtype='int64'),
'已发货': Int64Index([87], dtype='int64')}
print(df.groupby("状态").size()) # 查看各状态的元素个数
状态
交易关闭 41
交易取消 22
已付款未发货 24
已发货 1
dtype: int64
从上面的结果可以看出,如果只是传入列名,运行groupby()方法以后返回的不是一个DataFrame对象,而是一个DataFrameGroupBy对象,这个对象里面包含着分组以后的若干组数据,但是没有直接显示出来,需要对这些分组数据进行汇总计算以后才会展示出来。
df.groupby("状态").count()
实际价格(元) | 运费(元) | 数量 | 实际支付(元) | 商品SKU信息 | 省 | 市 | 区 | 会员等级 | 优惠信息 | 是否白付美支付 | 货款退款金额 | 运费退款金额 | 退款完成时间 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
状态 | ||||||||||||||
交易关闭 | 41 | 41 | 41 | 41 | 41 | 41 | 41 | 41 | 41 | 41 | 41 | 41 | 41 | 41 |
交易取消 | 22 | 22 | 22 | 22 | 22 | 22 | 22 | 22 | 22 | 22 | 22 | 22 | 22 | 0 |
已付款未发货 | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 24 | 0 |
已发货 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
通过调用get_group( )函数可以返回一个按照分组得到的DataFrame对象,如果想让这个DataFrame对象的索引重新定义可以通过set_index()方法
df.groupby("状态").get_group("已发货").set_index("省") #获取状态分组中的已发货信息并以省作为新索引
实际价格(元) | 运费(元) | 数量 | 实际支付(元) | 状态 | 商品SKU信息 | 市 | 区 | 会员等级 | 优惠信息 | 是否白付美支付 | 货款退款金额 | 运费退款金额 | 退款完成时间 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
省 | ||||||||||||||
上海市 | 328.9 | 0.0 | 1 | 328.9 | 已发货 | 米白S 1个 | 上海市 | 青浦区 | 获取会员信息失败! | 无优惠信息 | 否 | 0.0 | 0.0 | NaN |
由于对分组后的数据进行了计数运算,因此每一列都会有一个结果,但是如果对分组后的结果做一些数值运算,这个时候就只有数据类型是数值(int、float)的列才会参与运算,比如下面的求和运算。
df.groupby("状态").sum()
实际价格(元) | 运费(元) | 数量 | 实际支付(元) | 货款退款金额 | 运费退款金额 | |
---|---|---|---|---|---|---|
状态 | ||||||
交易关闭 | 8870.3 | 0.0 | 41 | 8870.3 | 8870.3 | 0.0 |
交易取消 | 14767.7 | 0.0 | 22 | 14767.7 | 0.0 | 0.0 |
已付款未发货 | 4910.6 | 0.0 | 24 | 4910.6 | 0.0 | 0.0 |
已发货 | 328.9 | 0.0 | 1 | 328.9 | 0.0 | 0.0 |
我们把这种对分组后的数据进行汇总运算的操作称为聚合,使用的函数称为聚合函数
1.1.2 按照多列进行分组
上面分组键是某一列,即按照一列进行分组,也可以按照多列进行分组,只要**