Python Pandas分组聚合的实现方法
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时为对列操作,=1时为对行操作。
map()和python内建的没啥区别,如df['one'].map(sqrt)。
importnumpyasnp frompandasimportSeries,DataFrame frame=DataFrame(np.random.randn(4,3), columns=list('bde'), index=['Utah','Ohio','Texas','Oregon']) printframe printnp.abs(frame) print f=lambdax:x.max()-x.min() printframe.apply(f) printframe.apply(f,axis=1) deff(x): returnSeries([x.min(),x.max()],index=['min','max']) printframe.apply(f) print print'applymap和map' _format=lambdax:'%.2f'%x printframe.applymap(_format) printframe['e'].map(_format)
Groupby
Groupby是Pandas中最为常用和有效的分组函数,有sum()、count()、mean()等统计函数。
groupby方法返回的DataFrameGroupBy对象实际并不包含数据内容,它记录的是df['key1']的中间数据。当你对分组数据应用函数或其他聚合运算时,pandas再依据groupby对象内记录的信息对df进行快速分块运算,并返回结果。
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']) printgrouped.mean() df.groupby(lambdax:'even'ifx%2==0else'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') printgrouped.agg('mean') data1data2 key1 a0.7491170.220249 b-0.567971-0.126922
apply()和agg()功能上差不多,apply()常用来处理不同分组的缺失数据的填充和topN的计算,会产生层级索引。
而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') printgrouped.agg(['sum','mean']) printgrouped.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 data2key1 key2
key1
a 2.780273-1.561696 aaa onetwoone
b -0.308320-1.382162 bb onetwo
apply和agg功能上基本是相近的,但是多个函数的时候还是agg比较方便。
apply本身的自由度很高,如果分组之后不做聚合操作紧紧是一些观察的时候,apply就有用武之地了。
printgrouped.apply(lambdax:x.describe()) data1data2 key1 acount3.0000003.000000 mean-0.887893-1.042878 std0.7775151.551220 min-1.429440-2.277311 25%-1.333350-1.913495 50%-1.237260-1.549679 75%-0.617119-0.425661 max0.0030210.698357 bcount2.0000002.000000 mean-0.0789830.106752 std0.7239290.064191 min-0.5908790.061362 25%-0.3349310.084057 50%-0.0789830.106752 75%0.1769640.129447 max0.4329120.152142
此外apply还能改变返回数据的维度。
http://pandas.pydata.org/pandas-docs/stable/groupby.html
此外还有透视表pivot_table,交叉表crosstab,但是我没用过。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。