时间:2021-05-22
如下:
import pandas as pd df = pd.DataFrame({'Country':['China','China', 'India', 'India', 'America', 'Japan', 'China', 'India'], 'Income':[10000, 10000, 5000, 5002, 40000, 50000, 8000, 5000], 'Age':[5000, 4321, 1234, 4010, 250, 250, 4500, 4321]})构造的数据如下:
Age Country Income0 5000 China 100001 4321 China 100002 1234 India 50003 4010 India 50024 250 America 400005 250 Japan 500006 4500 China 80007 4321 India 5000输出
America Age Country Income4 250 America 40000China Age Country Income0 5000 China 100001 4321 China 100006 4500 China 8000India Age Country Income2 1234 India 50003 4010 India 50027 4321 India 5000Japan Age Country Income5 250 Japan 50000输出
('America', 40000) Age Country Income4 250 America 40000('China', 8000) Age Country Income6 4500 China 8000('China', 10000) Age Country Income0 5000 China 100001 4321 China 10000('India', 5000) Age Country Income2 1234 India 50007 4321 India 5000('India', 5002) Age Country Income3 4010 India 5002('Japan', 50000) Age Country Income5 250 Japan 50000默认情况对分组之后其他列进行聚合
df_agg = df.groupby('Country').agg(['min', 'mean', 'max'])print(df_agg)输出
Age Income min mean max min mean maxCountry America 250 250.000000 250 40000 40000.000000 40000China 4321 4607.000000 5000 8000 9333.333333 10000India 1234 3188.333333 4321 5000 5000.666667 5002Japan 250 250.000000 250 50000 50000.000000 50000某些情况,只需要对部分数据进行不同的聚合操作,可以通过字典来构建
num_agg = {'Age':['min', 'mean', 'max']}print(df.groupby('Country').agg(num_agg))输出
Age min mean maxCountry America 250 250.000000 250China 4321 4607.000000 5000India 1234 3188.333333 4321Japan 250 250.000000 250num_agg = {'Age':['min', 'mean', 'max'], 'Income':['min', 'max']}print(df.groupby('Country').agg(num_agg))输出
Age Income min mean max min maxCountry America 250 250.000000 250 40000 40000China 4321 4607.000000 5000 8000 10000India 1234 3188.333333 4321 5000 5002Japan 250 250.000000 250 50000 50000补充:pandas——很全的groupby、agg,对表格数据分组与统计
我这篇groupby写的不好。太复杂了。其实实际上经常用的就那么几个。举个例子,把常用的往那一放就很容易理解和拿来用了。日后再写一篇。
groupby功能:分组
groupby + agg(聚集函数们): 分组后,对各组应用一些函数,如'sum',‘mean',‘max',‘min'…
groupby默认纵方向上分组,axis=0
DataFrameimport pandas as pdimport numpy as np df = pd.DataFrame({'key1':['a', 'a', 'b', 'b', 'a'], 'key2':['one', 'two', 'one', 'two', 'one'], 'data1':np.random.randn(5), 'data2':np.random.randn(5)})print(df) data1 data2 key1 key20 -0.410122 0.247895 a one1 -0.627470 -0.989268 a two2 0.179488 -0.054570 b one3 -0.299878 -1.640494 b two4 -0.297191 0.954447 a one分组,并对分组进行迭代
list(df.groupby(['key1']))#list后得到:[(group1),(group2),......][('a', data1 data2 key1 key2 0 -0.410122 0.247895 a one 1 -0.627470 -0.989268 a two 4 -0.297191 0.954447 a one), ('b', data1 data2 key1 key2 2 0.179488 -0.054570 b one 3 -0.299878 -1.640494 b two)]list后得到:[(group1),(group2),…]
每个数据片(group)格式: (name,group)元组
1. 按key1(一个列)分组,其实是按key1的值
groupby对象支持迭代,产生一组二元元组:(分组名,数据块),(分组名,数据块)…
for name,group in df.groupby(['key1']): print(name) print(group)a data1 data2 key1 key20 -0.410122 0.247895 a one1 -0.627470 -0.989268 a two4 -0.297191 0.954447 a oneb data1 data2 key1 key22 0.179488 -0.054570 b one3 -0.299878 -1.640494 b two2. 按[key1, key2](多个列)分组
对于多重键,产生的一组二元元组:((k1,k2),数据块),((k1,k2),数据块)…
第一个元素是由键值组成的元组
for name,group in df.groupby(['key1','key2']): print(name) #name=(k1,k2) print(group)('a', 'one') data1 data2 key1 key20 -0.410122 0.247895 a one4 -0.297191 0.954447 a one('a', 'two') data1 data2 key1 key21 -0.62747 -0.989268 a two('b', 'one') data1 data2 key1 key22 0.179488 -0.05457 b one('b', 'two') data1 data2 key1 key23 -0.299878 -1.640494 b two3. 按函数分组
4. 按字典分组
5. 按索引级别分组
6.将函数跟数组、列表、字典、Series混合使用也不是问题,因为任何东西最终都会被转换为数组
将这些数据片段做成字典
dict(list(df.groupby(['key1'])))#dict(list()){'a': data1 data2 key1 key2 0 -0.410122 0.247895 a one 1 -0.627470 -0.989268 a two 4 -0.297191 0.954447 a one, 'b': data1 data2 key1 key2 2 0.179488 -0.054570 b one 3 -0.299878 -1.640494 b two}分组后进行一些统计、计算等
1. 分组后,返回一个含有分组大小的Series
按key1分组
df.groupby(['key1']).size()key1a 3b 2dtype: int64dict(['a1','x2','e3']){'a': '1', 'e': '3', 'x': '2'}按[key1,key2]分组
df.groupby(['key1','key2']).size()key1 key2a one 2 two 1b one 1 two 1dtype: int642. 对data1按key1进行分组,并计算data1列的平均值
df['data1'].groupby(df['key1']).mean()#groupby没有进行任何的计算。它只是进行了一个分组key1a -0.444928b -0.060195Name: data1, dtype: float64df.groupby(['key1'])['data1'].mean()#理解:对df按key1分组,并计算分组后df['data1']的均值#等价于:df.groupby(['key1']).data1.mean()key1a -0.444928b -0.060195Name: data1, dtype: float64说明:
groupby没有进行任何的计算。它只是进行了一个分组。
数据(Series)根据分组键进行了聚合,产生了一个新的Series,其索引为key1列中的唯一值。
这种索引操作所返回的对象是一个已分组的DataFrame(如果传入的是列表或数组)或已分组的Series
df.groupby(['key1'])['data1'].size()key1a 3b 2Name: data1, dtype: int643.对data1按[key1,key2]进行分组,并计算data1的平均值
df['data1'].groupby([df['key1'],df['key2']]).mean()key1 key2a one -0.353657 two -0.627470b one 0.179488 two -0.299878Name: data1, dtype: float64df.groupby(['key1','key2'])['data1'].mean()#等价于:df.groupby(['key1','key2']).data1'.mean()key1 key2a one -0.353657 two -0.627470b one 0.179488 two -0.299878Name: data1, dtype: float64通过两个键对数据进行了分组,得到的Series具有一个层次化索引(由唯一的键对组成):
df.groupby(['key1','key2'])['data1'].mean().unstack() key2 one two key1 a -0.353657 -0.627470 b 0.179488 -0.299878在上面这些示例中,分组键均为Series。实际上,分组键可以是任何长度适当的数组。非常灵活。
横方向上
按列的数据类型(df.dtypes)来分
df共两种数据类型:float64和object,所以会分为两组(dtype(‘float64'),数据片),(dtype(‘O'), 数据片)
list(df.groupby(df.dtypes, axis=1))[(dtype('float64'), data1 data2 0 -0.410122 0.247895 1 -0.627470 -0.989268 2 0.179488 -0.054570 3 -0.299878 -1.640494 4 -0.297191 0.954447), (dtype('O'), key1 key2 0 a one 1 a two 2 b one 3 b two 4 a one)]agg的应用
groupby+agg 可以对groupby的结果同时应用多个函数
SeriesGroupBy的方法agg()参数:
aggregate(self, func_or_funcs, * args, ** kwargs)func: function, string, dictionary, or list of string/functions返回:aggregated的Series
s= pd.Series([10,20,30,40])s0 101 202 303 40dtype: int64for n,g in s.groupby([1,1,2,2]): print(n) print(g)0 101 20dtype: int6422 303 40dtype: int64s.groupby([1,1,2,2]).min()11 102 30dtype: int64#等价于这个:s.groupby([1,1,2,2]).agg('min')1 102 30dtype: int64s.groupby([1,1,2,2]).agg(['min','max'])#加[],func仅接受一个参数 min max 1 10 20 2 30 40常常这样用:
df
data1 data2 key1 key2 0 -0.410122 0.247895 a one 1 -0.627470 -0.989268 a two 2 0.179488 -0.054570 b one 3 -0.299878 -1.640494 b two 4 -0.297191 0.954447 a one比较下面,可以看出agg的用处:
df.groupby(['key1'])['data1'].min()key1a -0.627470b -0.299878Name: data1, dtype: float64df.groupby(['key1'])['data1'].agg({'min'}) min key1 a -0.627470 b -0.299878 #推荐用这个√df.groupby(['key1']).agg({'data1':'min'})#对data1列,取各组的最小值,名字还是data1 data1 key1 a -0.627470 b -0.299878 #按key1分组后,aggregate各组data1的最小值和最大值:df.groupby(['key1'])['data1'].agg({'min','max'}) max min key1 a -0.297191 -0.627470 b 0.179488 -0.299878 #推荐用这个√df.groupby(['key1']).agg({'data1':['min','max']}) data1 min max key1 a -0.627470 -0.297191 b -0.299878 0.179488可以对groupby的结果更正列名(不推荐用这个,哪怕在后面单独更改列名)
# 对data1,把min更名为a,max更名为bdf.groupby(['key1'])['data1'].agg({'a':'min','b':'max'})#这里的'min' 'max'为两个函数名d:\python27\lib\site-packages\ipykernel_launcher.py:2: FutureWarning: using a dict on a Series for aggregationis deprecated and will be removed in a future version a b key1 a -0.627470 -0.297191 b -0.299878 0.179488重要技巧: groupby之后直接.reset_index()可以得到一个没有多级索引的DataFrame
之后可以通过df.rename({‘old_col1':‘new_col1',‘old_col2':‘new_col2',…})重命名
eg:
df1= df.groupby(['date'])['price'].agg({'sum','count'}).reset_index()以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
数据分组使用groupby()方法进行分组group.size()查看分组后每组的数量group.groups查看分组情况group.get_group('名字
Pandas的apply函数概念(图解)实例1:怎样对数值按分组的归一化实例2:怎样取每个分组的TOPN数据到此这篇关于Pandas对每个分组应用apply函数
group做的聚合有些复杂。先选定分组所依据的键,此后MongoDB就会将集合依据选定键值的不同分成若干组。然后可以通过聚合每一组内的文档,产生一个结果文档。和
本文实例讲述了laravel框架分组控制器和分组路由实现方法。分享给大家供大家参考,具体如下:路由Route::group(['domain'=>'larave
先以mysql的语句,聚合用在分组里,对mysql中groupby是分组每什么的时候就要分组,如每个小组,就按小组分,groupby字段having聚合函数#举