Python Pandas分组聚合详解:apply、agg与groupby实战
本文深入解析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功能,尽管本文未深入展开使用案例。
以上为本文的全部内容,希望能为读者的学习提供有益帮助,也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













