iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >pandas group分组与agg聚合的实例
  • 173
分享到

pandas group分组与agg聚合的实例

2024-04-02 19:04:59 173人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

如下: import pandas as pd df = pd.DataFrame({'Country':['China','China', 'India', 'India'

如下:


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 Income
0 5000 China 10000
1 4321 China 10000
2 1234 India 5000
3 4010 India 5002
4 250 America 40000
5 250 Japan 50000
6 4500 China 8000
7 4321 India 5000

分组

单列分组


df_gb = df.groupby('Country')
for index, data in df_gb:
 print(index)
 print(data)

输出


America
 Age Country Income
4 250 America 40000
China
 Age Country Income
0 5000 China 10000
1 4321 China 10000
6 4500 China 8000
India
 Age Country Income
2 1234 India 5000
3 4010 India 5002
7 4321 India 5000
Japan
 Age Country Income
5 250 Japan 50000

多列分组


df_gb = df.groupby(['Country', 'Income'])
for (index1, index2), data in df_gb:
 print((index1, index2))
 print(data)

输出


('America', 40000)
 Age Country Income
4 250 America 40000
('China', 8000)
 Age Country Income
6 4500 China 8000
('China', 10000)
 Age Country Income
0 5000 China 10000
1 4321 China 10000
('India', 5000)
 Age Country Income
2 1234 India 5000
7 4321 India 5000
('India', 5002)
 Age Country Income
3 4010 India 5002
('Japan', 50000)
 Age Country Income
5 250 Japan 50000

聚合

对分组后数据进行聚合

默认情况对分组之后其他列进行聚合


df_agg = df.groupby('Country').agg(['min', 'mean', 'max'])
print(df_agg)

输出


 Age     Income      
   min   mean max min   mean max
Country              
America 250 250.000000 250 40000 40000.000000 40000
China 4321 4607.000000 5000 8000 9333.333333 10000
India 1234 3188.333333 4321 5000 5000.666667 5002
Japan  250 250.000000 250 50000 50000.000000 50000

对分组后的部分列进行聚合

某些情况,只需要对部分数据进行不同的聚合操作,可以通过字典来构建


num_agg = {'Age':['min', 'mean', 'max']}
print(df.groupby('Country').agg(num_agg))

输出


 Age     
   min   mean max
Country       
America 250 250.000000 250
China 4321 4607.000000 5000
India 1234 3188.333333 4321
Japan  250 250.000000 250
num_agg = {'Age':['min', 'mean', 'max'], 'Income':['min', 'max']}
print(df.groupby('Country').agg(num_agg))

输出


  Age     Income  
   min   mean max min max
Country          
America 250 250.000000 250 40000 40000
China 4321 4607.000000 5000 8000 10000
India 1234 3188.333333 4321 5000 5002
Japan  250 250.000000 250 50000 50000

补充:pandas——很全的groupby、agg,对表格数据分组与统计

我这篇groupby写的不好。太复杂了。其实实际上经常用的就那么几个。举个例子,把常用的往那一放就很容易理解和拿来用了。日后再写一篇。

groupby功能:分组

groupby + agg(聚集函数们): 分组后,对各组应用一些函数,如'sum',‘mean',‘max',‘min'…

groupby默认纵方向上分组,axis=0


DataFrame
import pandas as pd
import 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 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

分组,并对分组进行迭代


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 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

2. 按[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 key2
0 -0.410122 0.247895 a one
4 -0.297191 0.954447 a one
('a', 'two')
  data1  data2 key1 key2
1 -0.62747 -0.989268 a two
('b', 'one')
  data1 data2 key1 key2
2 0.179488 -0.05457 b one
('b', 'two')
  data1  data2 key1 key2
3 -0.299878 -1.640494 b two

3. 按函数分组

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()

key1
a 3
b 2
dtype: int64

dict(['a1','x2','e3'])



{'a': '1', 'e': '3', 'x': '2'}

按[key1,key2]分组


df.groupby(['key1','key2']).size()

key1 key2
a  one  2
  two  1
b  one  1
  two  1
dtype: int64

2. 对data1按key1进行分组,并计算data1列的平均值


df['data1'].groupby(df['key1']).mean()
#groupby没有进行任何的计算。它只是进行了一个分组

key1
a -0.444928
b -0.060195
Name: data1, dtype: float64

df.groupby(['key1'])['data1'].mean()#理解:对df按key1分组,并计算分组后df['data1']的均值
#等价于:df.groupby(['key1']).data1.mean()

key1
a -0.444928
b -0.060195
Name: data1, dtype: float64

说明:

groupby没有进行任何的计算。它只是进行了一个分组。

数据(Series)根据分组键进行了聚合,产生了一个新的Series,其索引为key1列中的唯一值。

这种索引操作所返回的对象是一个已分组的DataFrame(如果传入的是列表或数组)或已分组的Series


df.groupby(['key1'])['data1'].size()

key1
a 3
b 2
Name: data1, dtype: int64

3.对data1按[key1,key2]进行分组,并计算data1的平均值


df['data1'].groupby([df['key1'],df['key2']]).mean()

key1 key2
a  one -0.353657
  two -0.627470
b  one  0.179488
  two -0.299878
Name: data1, dtype: float64

df.groupby(['key1','key2'])['data1'].mean()
#等价于:df.groupby(['key1','key2']).data1'.mean()

key1 key2
a  one -0.353657
  two -0.627470
b  one  0.179488
  two -0.299878
Name: 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])
s

0 10
1 20
2 30
3 40
dtype: int64

for n,g in s.groupby([1,1,2,2]):
 print(n)
 print(g)

0 10
1 20
dtype: int64
2
2 30
3 40
dtype: int64

s.groupby([1,1,2,2]).min()
1
1 10
2 30
dtype: int64

#等价于这个:
s.groupby([1,1,2,2]).agg('min')

1 10
2 30
dtype: int64

s.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()

key1
a -0.627470
b -0.299878
Name: data1, dtype: float64

df.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更名为b
df.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 aggregation
is 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()

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。

--结束END--

本文标题: pandas group分组与agg聚合的实例

本文链接: https://www.lsjlt.com/news/122410.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • pandas group分组与agg聚合的实例
    如下: import pandas as pd df = pd.DataFrame({'Country':['China','China', 'India', 'India'...
    99+
    2024-04-02
  • Pandas实现聚合运算agg()的示例代码
    目录前言1. 创建DataFrame对象2. 单列聚合3. 多列聚合4. 多种聚合运算5. 多种聚合运算并更改列名6. 不同的列运用不同的聚合函数7. 使用自定义的聚合函数8. 方便...
    99+
    2024-04-02
  • pandas数据聚合与分组运算的实现
    数据聚合与分组运算 对数据集进行分组并对各组应用一个函数(无论是聚合还是转换),通常是数据分析工作中的重要环节。在将数据集加载、融合、准备好之后,通常就是计算分组统计或生成透视表。p...
    99+
    2023-01-28
    pandas 数据聚合 pandas 分组运算
  • pandas中聚合函数agg的具体用法
    今天看到pandas的聚合函数agg,比较陌生,平时的工作中处理数据的时候使用的也比较少,为了加深印象,总结一下使用的方法,其实还是挺好用的。 DataFrame.agg(func,...
    99+
    2024-04-02
  • python pandas分组聚合详细
    目录python pandas分组聚合1、环境2、分组3、序列分组4、多列分组5、索引分组7、聚合8、单函数对多列9、多函数对多列python pandas分组聚合 1、环境 ...
    99+
    2024-04-02
  • Pandas中的分组聚合是什么
    这篇文章给大家分享的是有关Pandas中的分组聚合是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一:分组 (groupby)对数据集进行分组,然后对每组进行统计分析SQL 能够对数据进行过滤,分组聚合pan...
    99+
    2023-06-27
  • group by聚合分组后如何获取分组数据
    之前用group by分组后一直困惑怎么把分组后的数据拿到,因为分组后同一组的只有一条数据,最后发现了group_concat函数。记录一下,以后能用。 语法:group_concat( [distinct] 要连接的字段 [o...
    99+
    2023-09-23
    数据库 mysql Powered by 金山文档
  • Maven的继承与聚合实例分析
    这篇文章主要介绍“Maven的继承与聚合实例分析”,在日常操作中,相信很多人在Maven的继承与聚合实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Maven的继承与聚合实例分析”的疑惑有所帮助!接下来...
    99+
    2023-07-02
  • pythonPandas中数据的合并与分组聚合
    目录一、字符串离散化示例 二、数据合并2.1 join 2.2 merge 三、数据的分组和聚合 四、索引总结一、字符串离散化示例 对于一组电...
    99+
    2024-04-02
  • Python Pandas聚合函数的应用示例
    目录Python Pandas聚合函数应用聚合函数1) 对整体聚合2) 对任意某一列聚合3) 对多列数据聚合4) 对单列应用多个函数5) 对不同列应用多个函数6) 对不同列应用不同函...
    99+
    2024-04-02
  • MongoDB聚合分组取第一条记录的案例与实现方法
    前言 今天开发同学向我们提了一个紧急的需求,从集合mt_resources_access_log中,根据字段refererDomain分组,取分组中最近一笔插入的数据,然后将这些符合条件的数据导入到集合mt...
    99+
    2024-04-02
  • Pandas数据分析多文件批次聚合处理实例解析
    目录前言一、多文件场景方法一方法二二、多文件读取前言 很多情况下我们处理的文件并不只是一个单纯的CSV文件或者Excel文件。我们会结合更多是数据去进行聚合统计分析,或许是需要解析...
    99+
    2023-02-15
    Pandas多文件聚合处理 Pandas 数据分析
  • mysql累积聚合原理与用法实例分析
    本文实例讲述了mysql累积聚合原理与用法。分享给大家供大家参考,具体如下: 累积聚合为聚合从序列内第一个元素到当前元素的数据,如为每个员工返回每月开始到现在累积的订单数量和平均订单数量 行号问题有两个解决...
    99+
    2024-04-02
  • PostgreSQL聚合函数的分组排序使用示例
    目录聚合函数COUNTSUM、AVGMAX、MIN聚合函数+DISTINCTGROUP BYHAVINGORDER BY聚合函数 用于汇总的函数。 COUNT COUNT,计...
    99+
    2024-04-02
  • 100天精通Python(数据分析篇)——第65天:Pandas聚合操作与案例
    文章目录 一、聚合 (aggregation) 1. 内置的聚合函数 2. 可自定义函数,传入agg方法中 3. 应用多个聚合函数 4. 对不同的列分别...
    99+
    2023-09-11
    python pandas 数据分析
  • MySQL组提交group commit实例分析
    今天小编给大家分享一下MySQL组提交group commit实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2023-07-02
  • Pandas实现批量拆分与合并Excel的示例代码
    目录前言一、拆分成小表格二、合并excel1.介绍2.代码前言 提示:这里可以添加本文要记录的大概内容: 将一个EXCEL等份拆成多个EXCEL 将多个小EXCEL合并成一个大EXC...
    99+
    2024-04-02
  • mongodb中聚合的示例分析
    这篇文章主要介绍了mongodb中聚合的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一:聚合常见的聚合操作跟sql server一...
    99+
    2024-04-02
  • MySQL聚合查询与联合查询操作的示例分析
    这篇文章主要为大家展示了“MySQL聚合查询与联合查询操作的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL聚合查询与联合查询操作的示例分析”这篇文章吧。一. 聚合查询1.聚合函...
    99+
    2023-06-29
  • MySQL聚合查询与联合查询操作实例
    目录一. 聚合查询1.聚合函数(count,sum,avg...)2.GROUP BY子句3.HAVING二. 联合查询((重点)多表)1.内连接2.外连接3.自连接4.子查...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作