Python Pandas分组聚合详解:apply、agg与groupby实战

Chloe
Chloe
发布时间:2026-10-13 | 6人浏览过
原创

本文深入解析Pandas中分组聚合的核心机制,详细对比apply、applymap、map及agg函数的适用场景与性能差异。通过groupby对象的工作原理,结合代码示例展示如何高效进行数据分组、统计分析及多维度聚合操作,帮助开发者优化数据处理流程。

开发环境辅助与基础函数概览

在PyCharm开发环境中,将鼠标悬停于函数名上并按下CTRL+Q快捷键,即可快速弹出该函数的文档说明;若需查看基础参数信息,可按下CTR+P快捷键获取提示。

主要涉及apply()、applymap()与map()三个函数的使用差异。

从作用对象来看,apply()和applymap()针对DataFrame对象,而map()专门用于Series对象。

apply()的处理粒度为DataFrame的某一行或某一列数据;applymap()则遍历DataFrame中的每一个元素;map()同样作用于Series中的每个元素。

apply()能够对DataFrame内容进行批量处理,其执行效率通常优于传统的循环操作。调用格式如df.apply(func, axis=0, ...),其中func代表自定义函数,当axis=0时针对列进行操作,axis=1时针对行进行操作。

map()的功能与Python内置函数类似,例如执行df['one'].map(sqrt)可直接对指定列应用平方根函数。


import numpy as np

from pandas import Series, DataFrame

 

frame = DataFrame(np.random.randn(4, 3),

         columns = list('bde'),

         index = ['Utah', 'Ohio', 'Texas', 'Oregon'])

print frame

print np.abs(frame)

print

 

f = lambda x: x.max() - x.min()

print frame.apply(f)

print frame.apply(f, axis = 1)

def f(x):

  return Series([x.min(), x.max()], index = ['min', 'max'])

print frame.apply(f)

print

 

print 'applymap和map'

_format = lambda x: '%.2f' % x

print frame.applymap(_format)

print frame['e'].map(_format) 

Groupby分组机制与聚合函数对比

Groupby(分组)操作。

Groupby是Pandas中最常用且高效的分组工具,支持sum()、count()、mean()等多种统计函数。

groupby方法返回的DataFrameGroupBy对象并不直接包含数据内容,而是记录了df['key1']的中间状态信息。当对分组数据应用函数或其他聚合运算时,Pandas会依据groupby对象内记录的信息对原始DataFrame进行快速分块计算,并最终返回结果。


df = DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'],

        'key2': ['one', 'two', 'one', 'two', 'one'],

        'data1': np.random.randn(5),

        'data2': np.random.randn(5)})

grouped = df.groupby(df['key1'])

print grouped.mean() 



df.groupby(lambda x:'even' if x%2==0 else 'odd').mean() #通过函数分组 

聚合操作agg()。

对于分组后的某一列(或行,axis=0/1)或多个列(或行),应用agg(func)可对分组数据执行func函数。例如,使用grouped['data1'].agg('mean')可对分组后的'data1'列计算均值。此外,该函数也可同时作用于多列(或行)并配合多个函数使用。


df = DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'],

        'key2': ['one', 'two', 'one', 'two', 'one'],

        'data1': np.random.randn(5),

        'data2': np.random.randn(5)})

grouped = df.groupby('key1')

print grouped.agg('mean')

 

     data1   data2

key1          

a   0.749117 0.220249

b  -0.567971 -0.126922 

apply()与agg()在功能上较为相似,但apply()常用于处理不同分组的缺失数据填充及Top N计算,且容易产生层级索引。

相比之下,agg()可以同时传入多个函数,并作用于不同的列,操作更为灵活。


df = DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'],

        'key2': ['one', 'two', 'one', 'two', 'one'],

        'data1': np.random.randn(5),

        'data2': np.random.randn(5)})

grouped = df.groupby('key1')

print grouped.agg(['sum','mean'])
print grouped.apply(np.sum)  #apply的在这里同样适用,只是不能传入多个,这两个函数基本是可以通用的。 

示例数据展示: data1 data2 sum mean sum mean key1 a 2.780273 0.926758 -1.561696 -0.520565 b -0.308320 -0.154160 -1.382162 -0.691081

扩展数据展示: data1 data2 key1 key2 key1 a 2.780273 -1.561696 aaa onetwoone b -0.308320 -1.382162 bb onetwo

apply和agg在功能上基本相近,但在需要同时使用多个函数时,agg()的使用更为便捷。

apply()本身具有极高的自由度,若分组后仅需进行观察而无需聚合操作,apply()则能发挥重要作用。


print grouped.apply(lambda x: x.describe())

 

        data1   data2

key1             

a  count 3.000000 3.000000

   mean -0.887893 -1.042878

   std  0.777515 1.551220

   min  -1.429440 -2.277311

   25%  -1.333350 -1.913495

   50%  -1.237260 -1.549679

   75%  -0.617119 -0.425661

   max  0.003021 0.698357

b  count 2.000000 2.000000

   mean -0.078983 0.106752

   std  0.723929 0.064191

   min  -0.590879 0.061362

   25%  -0.334931 0.084057

   50%  -0.078983 0.106752

   75%  0.176964 0.129447

   max  0.432912 0.152142 

此外,apply()还能改变返回数据的维度结构。

更多详细信息可参考官方文档:http://pandas.pydata.org/pandas-docs/stable/groupby.html

此外,Pandas还提供透视表pivot_table和交叉表crosstab功能,尽管本文未深入展开使用案例。

以上为本文的全部内容,希望能为读者的学习提供有益帮助,也欢迎大家继续支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表