本文主要介绍如何使用pandas中的聚合函数groupby的用法并给出其应用实例
此处谢谢同学兼朋友杨博 “赞助” 的原始数据xlsx文件
持续更新中
如果你有在本文看到对你有用的知识点,麻烦帮忙点赞关注收藏一键三连~ 😁
Last Modified Date: 2021/11/20
Python | Pandas | 聚合函数groupby用法及应用实例
本文为讲解聚合函数而所使用的原始数据可在此处找到
聚合函数
意义
使用映射器或按Series列对DataFrame或Series进行分组。
group
分组操作涉及拆分对象,应用功能以及组合结果的某种组合。这可用于对大量数据进行分组并在这些组上进行计算操作。
语法
def groupby(
self,
by=None,
axis=0,
level=None,
as_index=True,
sort=True,
group_keys=True,
squeeze=False,
observed=False,
**kwargs
)
作用 | |
---|---|
参数 | - by: 映射,功能,标签或标签列表用于确定分组依据的分组。如果by是函数,则在对象索引的每个值上调用它。如果通过了dict或Series,则将使用Series或dict VALUES来确定组(将Series的值首先对齐;请参见.align()方法)。如果传递了ndarray,则按原样使用这些值来确定组。标签或标签列表可以按中的列传递给分组self。注意,元组被解释为(单个)key。 - axis: {0或’index’,1或’columns’},默认0。沿rows (0)或columns (1)拆分。 - level: int,level名称或此类的序列,默认为None。如果axis是MultiIndex(分层),则按一个或多个特定级别分组。 - as_index: bool,默认为True。对于聚合输出,返回带有组标签的对象作为索引。仅与DataFrame输入有关。- as_index = False实际上是“ SQL风格”的分组输出。 - sort: 布尔值,默认为True。排序组键。关闭此功能可获得更好的性能。请注意,这不会影响每个组中观察的顺序。Groupby保留每个组中行的顺序。 如果不想历经 groupby 函数后结果的索引排序乱掉[与原始数据不一致], 可以sort=False ,参见此处。- group_keys: 布尔值,默认为True。调用apply时,将组键添加到索引以识别片段。 - squeeze: 布尔值,默认为False。如果可能,请减小返回类型的维数,否则返回一致的类型。 - observed: 布尔值,默认为False。仅当任何groupers为Categoricals时才适用。如果为True:仅显示分类groupers的观测值。如果为False:显示分类groupers的所有值。 - **kwargs: 可选,仅接受关键字参数"mutated"并传递给groupby。 |
返回值 | DataFrameGroupBy或SeriesGroupBy,依赖于调用对象,并返回包含有关组信息的groupby对象。 |
聚合
单索引
此处总结单索引条件下对单列或多列进行聚合运算:
单列
多列
相同运算
不同运算
多索引聚合
此处总结多索引条件下对单列或多列进行聚合运算:
单列
此处为多索引条件下对单列进行单种或多种聚合运算:
单运算
举例,此处对双索引 ‘province’, ‘uid’ 条件下对 ‘docid’ 列进行 ‘count‘ 运算
# data = data.groupby(['province', 'uid']).agg({'docid': ['count']})
# the same with
data = data.groupby(['province', 'uid']).agg({'docid': 'count'})
'''
print(data)
docid
province uid
云南省 125825.0 1
6331762.0 4
6724869.0 2
7088853.0 2
7119058.0 2
... ...
黑龙江省 7213860.0 6
7213955.0 2
7216948.0 4
7216960.0 6
7216985.0 4
[278 rows x 1 columns]
############################################################
print(data.index.names)
['province', 'uid']
print(data.index)
MultiIndex([( '云南省', 125825.0),
( '云南省', 6331762.0),
( '云南省', 6724869.0),
( '云南省', 7088853.0),
( '云南省', 7119058.0),
( '云南省', 7119448.0),
( '云南省', 7166576.0),
( '云南省', 7190777.0),
( '云南省', 7208339.0),
( '云南省', 7213895.0),
...
('黑龙江省', 7080483.0),
('黑龙江省', 7185586.0),
('黑龙江省', 7203299.0),
('黑龙江省', 7208440.0),
('黑龙江省', 7213096.0),
('黑龙江省', 7213860.0),
('黑龙江省', 7213955.0),
('黑龙江省', 7216948.0),
('黑龙江省', 7216960.0),
('黑龙江省', 7216985.0)],
names=['province', 'uid'], length=278)
############################################################
print(data.columns)
Index(['docid'], dtype='object')
'''
等价写法
agg
data = data.groupby(['province', 'uid'])['docid'].agg('count')
data = data.groupby(['province', 'uid']).agg('count')['docid']
function itself
data = data.groupby(['province', 'uid'])['docid'].count()
data = data.groupby(['province', 'uid']).count()['docid']
重命名
举例,此处对双索引 ‘province’, ‘uid’ 条件下对 ‘docid’ 列进行 ‘count‘ 运算,并对被运算列进行重命名
data = data.groupby(['province', 'uid']).agg(rename=('docid','count'))
'''
print(data)
rename
province uid
云南省 125825.0 1
6331762.0 4
6724869.0 2
7088853.0 2
7119058.0 2
... ...
黑龙江省 7213860.0 6
7213955.0 2
7216948.0 4
7216960.0 6
7216985.0 4
[278 rows x 1 columns]
############################################################
print(data.columns)
Index(['rename'], dtype='object')
'''
多运算
多列
此处为多索引条件下对多列进行单种或多种聚合运算:
单运算
多运算
相同运算
举例,此处对双索引 ‘province’, ‘uid’ 条件下对 ‘docid’ 和 ‘score’ 两列进行 ‘count‘ 和 ‘sum’ 运算
data = data.groupby(['province', 'uid'])[['docid', 'score']].agg(['count', 'sum'])
'''
print(data)
docid score
count sum count sum
province uid
云南省 125825.0 1 7216961651613 0 0.0
6331762.0 4 467844396052 1 1.4
6724869.0 2 632156392222 0 0.0
7088853.0 2 4833563750634 1 1.5
7119058.0 2 33432144084238 1 1.5
... ... ... ... ...
黑龙江省 7213860.0 6 18101440078266 1 1.5
7213955.0 2 233439461830 1 1.1
7216948.0 4 29264485995264 1 1.5
7216960.0 6 21098298076700 2 2.0
7216985.0 4 1664886146076 1 1.8
[278 rows x 4 columns]
############################################################
print(data.index.names)
['province', 'uid']
print(data.index)
MultiIndex([( '云南省', 125825.0),
( '云南省', 6331762.0),
( '云南省', 6724869.0),
( '云南省', 7088853.0),
( '云南省', 7119058.0),
( '云南省', 7119448.0),
( '云南省', 7166576.0),
( '云南省', 7190777.0),
( '云南省', 7208339.0),
( '云南省', 7213895.0),
...
('黑龙江省', 7080483.0),
('黑龙江省', 7185586.0),
('黑龙江省', 7203299.0),
('黑龙江省', 7208440.0),
('黑龙江省', 7213096.0),
('黑龙江省', 7213860.0),
('黑龙江省', 7213955.0),
('黑龙江省', 7216948.0),
('黑龙江省', 7216960.0),
('黑龙江省', 7216985.0)],
names=['province', 'uid'], length=278)
############################################################
print(data.columns)
MultiIndex([('docid', 'count'),
('docid', 'sum'),
('score', 'count'),
('score', 'sum')],
)
'''
不同运算
举例,此处对双索引 ‘province’, ‘uid’ 条件下对 ‘docid’ 和 ‘score’ 两列分别进行 ‘count‘和‘sum’ 运算
data = data.groupby(['province', 'uid']).agg({'docid':'count', 'score': 'sum'})
'''
print(data)
docid score
province uid
云南省 125825.0 1 0.0
6331762.0 4 1.4
6724869.0 2 0.0
7088853.0 2 1.5
7119058.0 2 1.5
... ... ...
黑龙江省 7213860.0 6 1.5
7213955.0 2 1.1
7216948.0 4 1.5
7216960.0 6 2.0
7216985.0 4 1.8
[278 rows x 2 columns]
############################################################
print(data.index.names)
['province', 'uid']
print(data.index)
MultiIndex([( '云南省', 125825.0),
( '云南省', 6331762.0),
( '云南省', 6724869.0),
( '云南省', 7088853.0),
( '云南省', 7119058.0),
( '云南省', 7119448.0),
( '云南省', 7166576.0),
( '云南省', 7190777.0),
( '云南省', 7208339.0),
( '云南省', 7213895.0),
...
('黑龙江省', 7080483.0),
('黑龙江省', 7185586.0),
('黑龙江省', 7203299.0),
('黑龙江省', 7208440.0),
('黑龙江省', 7213096.0),
('黑龙江省', 7213860.0),
('黑龙江省', 7213955.0),
('黑龙江省', 7216948.0),
('黑龙江省', 7216960.0),
('黑龙江省', 7216985.0)],
names=['province', 'uid'], length=278)
############################################################
print(data.columns)
Index(['docid', 'score'], dtype='object')
'''
参考文章
聚合函数
Python pandas.DataFrame.groupby函数方法的使用
Dataframe GroupBy的顺序错误
聚合
单索引聚合
Pandas的基础操作:常用函数(求均值,方差,求和,众数,统计元素个数等)/分组运算groupby操作/透视表