Python | Pandas | 聚合函数groupby用法及应用实例

本文主要介绍如何使用pandas中的聚合函数groupby的用法并给出其应用实例
此处谢谢同学兼朋友杨博 “赞助” 的原始数据xlsx文件
持续更新中
如果你有在本文看到对你有用的知识点,麻烦帮忙点赞关注收藏一键三连~ 😁
Last Modified Date: 2021/11/20



本文为讲解聚合函数而所使用的原始数据可在此处找到

聚合函数

意义

使用映射器或按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操作/透视表

多索引聚合

Pandas中实现聚合统计,有几种方法?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值