18-Pandas groupby分组操作

Pandas groupby分组操作详解

在数据分析中,经常会遇到这样的情况:根据某一列(或多列)标签把数据划分为不同的组别,然后再对其进行数据分析。比如,某网站对注册用户的性别或者年龄等进行分组,从而研究出网站用户的画像(特点)。在 Pandas 中,要完成数据的分组操作,需要使用 groupby() 函数,它和 SQL 的GROUP BY操作非常相似。

在划分出来的组(group)上应用一些统计函数,从而达到数据分析的目的,比如对分组数据进行聚合、转换,或者过滤。这个过程主要包含以下三步:

  • 拆分(Spliting):表示对数据进行分组;
  • 应用(Applying):对分组数据应用聚合函数,进行相应计算;
  • 合并(Combining):最后汇总计算结果。

下面对 groupby() 函数的应用过程进行具体的讲解。

创建DataFrame对象

提供数据:empdata.csv:

EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO
7369,SMITH,CLERK,7902.0,1980-12-17,800,,20
7499,ALLEN,SALESMAN,7698.0,1981-02-20,1600,300.0,30
7521,WARD,SALESMAN,7698.0,1981-02-22,1250,500.0,30
7566,JONES,MANAGER,7839.0,1981-04-02,2975,,20
7654,MARTIN,SALESMAN,7698.0,1981-09-28,1250,1400.0,30
7698,BLAKE,MANAGER,7839.0,1981-05-01,2850,,30
7782,CLARK,MANAGER,7839.0,1981-06-09,2450,,10
7788,SCOTT,ANALYST,7566.0,1987-04-19,3000,,20
7839,KING,PRESIDENT,,1981-11-17,5000,,10
7844,TURNER,SALESMAN,7698.0,1981-09-08,1500,0.0,30
7876,ADAMS,CLERK,7788.0,1987-05-23,1100,,20
7900,JAMES,CLERK,7698.0,1981-12-03,950,,30
7902,FORD,ANALYST,7566.0,1981-12-03,3000,,20
7934,MILLER,CLERK,7782.0,1982-01-23,1300,,10

首先我们创建一个 DataFrame 对象,下面数据描述了某公司员工信息:

import pandas as pd
import numpy as np
df  = pd.read_csv('C:\\Users\\qwy\Desktop\data\\empdata.csv')
print(df)

输出结果:

    EMPNO   ENAME        JOB     MGR    HIREDATE   SAL    COMM  DEPTNO
0    7369   SMITH      CLERK  7902.0  1980-12-17   800     NaN      20
1    7499   ALLEN   SALESMAN  7698.0  1981-02-20  1600   300.0      30
2    7521    WARD   SALESMAN  7698.0  1981-02-22  1250   500.0      30
3    7566   JONES    MANAGER  7839.0  1981-04-02  2975     NaN      20
4    7654  MARTIN   SALESMAN  7698.0  1981-09-28  1250  1400.0      30
5    7698   BLAKE    MANAGER  7839.0  1981-05-01  2850     NaN      30
6    7782   CLARK    MANAGER  7839.0  1981-06-09  2450     NaN      10
7    7788   SCOTT    ANALYST  7566.0  1987-04-19  3000     NaN      20
8    7839    KING  PRESIDENT     NaN  1981-11-17  5000     NaN      10
9    7844  TURNER   SALESMAN  7698.0  1981-09-08  1500     0.0      30
10   7876   ADAMS      CLERK  7788.0  1987-05-23  1100     NaN      20
11   7900   JAMES      CLERK  7698.0  1981-12-03   950     NaN      30
12   7902    FORD    ANALYST  7566.0  1981-12-03  3000     NaN      20
13   7934  MILLER      CLERK  7782.0  1982-01-23  1300     NaN      10

创建groupby分组对象

使用 groupby() 可以沿着任意轴分组。您可以把分组时指定的键(key)作为每组的组名,方法如下所示:

  • df.groupby(“key”)
  • df.groupby(“key”,axis=1)
  • df.groupby([“key1”,“key2”])

通过上述方法对 DataFrame 对象进行分组操作:

import pandas as pd
import numpy as np
df  = pd.read_csv('C:\\Users\\qwy\Desktop\data\\empdata.csv')
print("按照部门编号分组:\n",df.groupby("DEPTNO"))

输出结果:

按照部门编号分组:
 <pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000020F2B536070>

查看分组结果

1) groups查看分组结果

通过调用groups属性查看分组结果:

import pandas as pd
import numpy as np
df  = pd.read_csv('C:\\Users\\qwy\Desktop\data\\empdata.csv')
print("按照部门编号分组:\n",df.groupby("DEPTNO").groups)

输出结果:

按照部门编号分组:
 {10: [6, 8, 13], 20: [0, 3, 7, 10, 12], 30: [1, 2, 4, 5, 9, 11]}	
2) 多个列标签分组

当然也可以指定多个列标签进行分组,示例如下:

import pandas as pd
import numpy as np
df  = pd.read_csv('C:\\Users\\qwy\Desktop\data\\empdata.csv')
print("按照部门编号分组:\n",df.groupby(["DEPTNO","MGR"]).groups)

输出结果:

按照部门编号分组:
 {(10, 7839.0): [6], (10, nan): [8], (10, 7782.0): [13], (20, 7566.0): [7, 12], (20, 7788.0): [10], (20, 7839.0): [3], (20, 7902.0): [0], (30, 7698.0): [1, 2, 4, 9, 11], (30, 7839.0): [5]}

通过 get_group() 方法可以选择组内的具体数据项:

import pandas as pd
import numpy as np
df  = pd.read_csv('C:\\Users\\qwy\Desktop\data\\empdata.csv')
print("按照部门编号分组:\n",df.groupby(["DEPTNO"]).groups)
print("获取部门10的具体项:\n",df.groupby("DEPTNO").get_group(10))

输出结果:

按照部门编号分组:
 {10: [6, 8, 13], 20: [0, 3, 7, 10, 12], 30: [1, 2, 4, 5, 9, 11]}
获取部门10的具体项:
     EMPNO   ENAME        JOB     MGR    HIREDATE   SAL  COMM  DEPTNO
6    7782   CLARK    MANAGER  7839.0  1981-06-09  2450   NaN      10
8    7839    KING  PRESIDENT     NaN  1981-11-17  5000   NaN      10
13   7934  MILLER      CLERK  7782.0  1982-01-23  1300   NaN      10

遍历分组数据

通过以下方法来遍历分组数据,示例如下:

import pandas as pd
import numpy as np
df  = pd.read_csv('C:\\Users\\qwy\Desktop\data\\empdata.csv')
print("遍历分组后的数据:")
for lable,value in df.groupby('DEPTNO'):
    print(f"分组后,部门{lable}的数据:\n{value}")

输出结果:

遍历分组后的数据:
分组后,部门10的数据:
    EMPNO   ENAME        JOB     MGR    HIREDATE   SAL  COMM  DEPTNO
6    7782   CLARK    MANAGER  7839.0  1981-06-09  2450   NaN      10
8    7839    KING  PRESIDENT     NaN  1981-11-17  5000   NaN      10
13   7934  MILLER      CLERK  7782.0  1982-01-23  1300   NaN      10
分组后,部门20的数据:
    EMPNO  ENAME      JOB     MGR    HIREDATE   SAL  COMM  DEPTNO
0    7369  SMITH    CLERK  7902.0  1980-12-17   800   NaN      20
3    7566  JONES  MANAGER  7839.0  1981-04-02  2975   NaN      20
7    7788  SCOTT  ANALYST  7566.0  1987-04-19  3000   NaN      20
10   7876  ADAMS    CLERK  7788.0  1987-05-23  1100   NaN      20
12   7902   FORD  ANALYST  7566.0  1981-12-03  3000   NaN      20
分组后,部门30的数据:
    EMPNO   ENAME       JOB     MGR    HIREDATE   SAL    COMM  DEPTNO
1    7499   ALLEN  SALESMAN  7698.0  1981-02-20  1600   300.0      30
2    7521    WARD  SALESMAN  7698.0  1981-02-22  1250   500.0      30
4    7654  MARTIN  SALESMAN  7698.0  1981-09-28  1250  1400.0      30
5    7698   BLAKE   MANAGER  7839.0  1981-05-01  2850     NaN      30
9    7844  TURNER  SALESMAN  7698.0  1981-09-08  1500     0.0      30
11   7900   JAMES     CLERK  7698.0  1981-12-03   950     NaN      30

如上所示, groupby 对象的组名称与 DEPTNO 中的的元素值一一对应。

应用聚合函数

当您在创建 groupby 对象时,通过 agg() 函数可以对分组对象应用多个聚合函数:

import pandas as pd
import numpy as np
df  = pd.read_csv('C:\\Users\\qwy\Desktop\data\\empdata.csv')

print("分组后使用聚合函数:\n",df.groupby("DEPTNO")[["SAL","COMM"]].agg(np.sum))
#以下方式也可以
#print("分组后使用聚合函数:\n",df.groupby("DEPTNO")[["SAL","COMM"]].sum())

输出结果:

分组后使用聚合函数:
           SAL    COMM
DEPTNO               
10       8750     0.0
20      10875     0.0
30       9400  2200.0

当然,您也可以一次性应有多个聚合函数,示例如下:

import pandas as pd
import numpy as np
df  = pd.read_csv('C:\\Users\\qwy\Desktop\data\\empdata.csv')

print("分组后使用聚合函数:\n",df.groupby("DEPTNO")[["SAL","COMM"]].agg([np.sum,np.size,np.mean,np.std]))

输出结果:

分组后使用聚合函数:
           SAL                                   COMM                        
          sum size         mean          std     sum size   mean         std
DEPTNO                                                                      
10       8750    3  2916.666667  1893.629672     0.0    3    NaN         NaN
20      10875    5  2175.000000  1123.332097     0.0    5    NaN         NaN
30       9400    6  1566.666667   668.331255  2200.0    6  550.0  602.771377

组的转换操作

在组的行或列上可以执行转换操作,最终会返回一个与组大小相同的索引对象。示例如下:

import pandas as pd
import numpy as np
df  = pd.read_csv('C:\\Users\\qwy\Desktop\data\\empdata.csv')

print("获取SAL和COMM的均值:\n",df.groupby("DEPTNO")[["SAL","COMM"]].transform(np.mean))
demean = lambda arr:arr - arr.mean()
print("获取SAL和COMM的均值的差:\n",df.groupby("DEPTNO")[["SAL","COMM"]].transform(demean))


def get_rows(df, n):
    # 从1到n行的所有列
    return df.iloc[:n, :]
# 分组后的组名作为行索引
print("获取分组后,每组的前N行:\n",df.groupby('DEPTNO').apply(get_rows, n=1))

输出结果:

获取SAL和COMM的均值:
             SAL   COMM
0   2175.000000    NaN
1   1566.666667  550.0
2   1566.666667  550.0
3   2175.000000    NaN
4   1566.666667  550.0
5   1566.666667  550.0
6   2916.666667    NaN
7   2175.000000    NaN
8   2916.666667    NaN
9   1566.666667  550.0
10  2175.000000    NaN
11  1566.666667  550.0
12  2175.000000    NaN
13  2916.666667    NaN
获取SAL和COMM的均值的差:
             SAL   COMM
0  -1375.000000    NaN
1     33.333333 -250.0
2   -316.666667  -50.0
3    800.000000    NaN
4   -316.666667  850.0
5   1283.333333    NaN
6   -466.666667    NaN
7    825.000000    NaN
8   2083.333333    NaN
9    -66.666667 -550.0
10 -1075.000000    NaN
11  -616.666667    NaN
12   825.000000    NaN
13 -1616.666667    NaN
获取分组后,每组的前N行:
           EMPNO  ENAME       JOB     MGR    HIREDATE   SAL   COMM  DEPTNO
DEPTNO                                                                   
10     6   7782  CLARK   MANAGER  7839.0  1981-06-09  2450    NaN      10
20     0   7369  SMITH     CLERK  7902.0  1980-12-17   800    NaN      20
30     1   7499  ALLEN  SALESMAN  7698.0  1981-02-20  1600  300.0      30

组的数据过滤操作

通过 filter() 函数可以实现数据的筛选,该函数根据定义的条件过滤数据并返回一个新的数据集。

下面,获取部门平均工资大于2000的员工信息:

import pandas as pd
import numpy as np
df  = pd.read_csv('C:\\Users\\qwy\Desktop\data\\empdata.csv')

print("每个部门的平均成绩:\n",df.groupby("DEPTNO")[['DEPTNO','SAL']].aggregate(np.mean))

print("获取部门平均工资大于2000的员工信息:\n",df.groupby("DEPTNO").filter(lambda x:x['SAL'].mean()>2000))

输出结果:

每个部门的平均成绩:
         DEPTNO          SAL
DEPTNO                     
10        10.0  2916.666667
20        20.0  2175.000000
30        30.0  1566.666667
获取部门平均工资大于2000的员工信息:
     EMPNO   ENAME        JOB     MGR    HIREDATE   SAL  COMM  DEPTNO
0    7369   SMITH      CLERK  7902.0  1980-12-17   800   NaN      20
3    7566   JONES    MANAGER  7839.0  1981-04-02  2975   NaN      20
6    7782   CLARK    MANAGER  7839.0  1981-06-09  2450   NaN      10
7    7788   SCOTT    ANALYST  7566.0  1987-04-19  3000   NaN      20
8    7839    KING  PRESIDENT     NaN  1981-11-17  5000   NaN      10
10   7876   ADAMS      CLERK  7788.0  1987-05-23  1100   NaN      20
12   7902    FORD    ANALYST  7566.0  1981-12-03  3000   NaN      20
13   7934  MILLER      CLERK  7782.0  1982-01-23  1300   NaN      10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/771819.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

​香橙派AIpro测评:usb鱼眼摄像头的Camera图像获取

一、前言 近期收到了一块受到业界人士关注的开发板"香橙派AIpro",因为这块板子具有极高的性价比&#xff0c;同时还可以兼容ubuntu、安卓等多种操作系统&#xff0c;今天博主便要在一块832g的香橙派AI香橙派AIpro进行YoloV5s算法的部署并使用一个外接的鱼眼USB摄像头…

小龙虾优化24种机器学习多输入单输出回归|时序预测模型

小龙虾优化24种机器学习多输入单输出回归|时序预测模型 文章目录 小龙虾优化24种机器学习多输入单输出回归|时序预测模型前言一、小龙虾优化基本原理二、优化机器学习模型1.COA-CNN-BiGRU-Attention回归模型2.基于小龙虾优化支持向量机的数据回归预测Matlab程序COA-SVM 多特征输…

Android EditText的属性与用法

EditText 是编辑框控件&#xff0c;可以接收用户输入&#xff0c;并在程序中对用户输入进行处理。EditText在App里随处可见&#xff0c;在进行搜索、聊天、拨号等需要输入信息的场合&#xff0c;都可以使用 EditText。 图1 编辑框示意图 EditText 是TextView的子类&#xff0c…

sql语句练习注意点

1、时间可以进行排序&#xff0c;也可以用聚合函数对时间求最大值max&#xff08;时间&#xff09; 例如下面的例子&#xff1a;取最晚入职的人&#xff0c;那就是将入职时间倒序排序&#xff0c;然后limit 1 表&#xff1a; 场景&#xff1a;查找最晚入职员工的所有信息 se…

【unity实战】使用Unity实现动作游戏的攻击 连击 轻重攻击和打击感

最终效果 文章目录 最终效果前言素材下载&#xff1a;玩家移动跳跃控制攻击动画配置轻攻击重攻击 攻击时禁止移动和攻击移动补偿敌人击退和播放受击动画受击特效攻击停顿和屏幕震动局部顿帧&#xff08;补充&#xff09;参考源码完结 前言 注意本文为自己的学习记录笔记&#…

日志自动提取---七牛Logkit观星应急工具

目录 七牛Logkit (Windows&Linux&Mac 等) 下载: 文档: windows配置过程: 1-下载 2-修改logkit-community基本配置 3-启动! 4-浏览器访问 5-添加配置吧 观星应急工具 &#xff08;Windows 系统日志&#xff09; 七牛Logkit (Windows&Linux&Mac 等) -…

WCCI 2024第三弹:忍者表演惊艳全场,盛大晚宴不容错过

WCCI 2024第三弹&#xff1a;忍者表演惊艳全场&#xff0c;盛大晚宴不容错过&#xff01; 会议之眼 快讯 会议介绍 IEEE WCCI&#xff08;World Congress on Computational Intelligence&#xff09;2024&#xff0c;即2024年IEEE世界计算智能大会&#xff0c;于6月30日至7月…

React@16.x(47)路由v5.x(12)源码(4)- 实现 Route

目录 1&#xff0c;原生 Route 的渲染内容2&#xff0c;实现 1&#xff0c;原生 Route 的渲染内容 对如下代码来说&#xff1a; import { BrowserRouter as Router, Route } from "react-router-dom"; function News() {return <div>News</div>; }func…

使用SSE实现echarts数据实时更新

区别 SSE 和 WebSocket 原理和实现方式的区别 SSE( Server-Sent Events) SSE 是基于传统的 HTTP 协议实现的&#xff0c;采用了长轮询&#xff08;long-polling&#xff09;机制。客户端通过向服务器发送一个 HTTP 请求&#xff0c;服务器保持连接打开并周期性地向客户端发送…

NoSQL之Redis高可用与优化

一、Redis高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证…

Android adb logcat日志过滤输出

Android adb logcat日志过滤输出 adb logcat 输出所有Android设备上的日志。 adb logcat *:Error 过滤输出日志级别只为Error的日志。 过滤某些标签或tag&#xff0c;依次执行: adb shell logcat grep | "你的标签或tag" Android Studio level过滤查看各个等级的日志…

Oracle连接mysql

oracle使用的11g&#xff0c;在一台windows服务器&#xff1b;mysql使用的是5.7版本&#xff0c;在另一台windows服务器&#xff0c;这两个服务器之间的网络是互通的。做BI时&#xff0c;要获取不同数据源的数据&#xff0c;这些数据源可能是Oracle&#xff0c;也可能是sqlserv…

股票分析-20240628

今日关注&#xff1a; 20240626 六日涨幅最大: ------1--------300386--------- 飞天诚信 五日涨幅最大: ------1--------300386--------- 飞天诚信 四日涨幅最大: ------1--------300386--------- 飞天诚信 三日涨幅最大: ------1--------300386--------- 飞天诚信 二日涨幅最…

【pytorch14】感知机

单层感知机模型 对于单层的感知机&#xff0c;它的激活函数是一个sigmoid 对于符号的定义做一个规范化&#xff0c;输入层每一层进行一个编号 输入是第0层&#xff0c;上标0表示属于输入层&#xff0c;下标0到n表示一共有n个节点(这里严格来说应该是0~n-1&#xff0c;为了书写…

Zoom使用的基本步骤和注意事项

Zoom是一款功能强大的视频会议软件&#xff0c;广泛应用于远程办公、在线教育、团队协作等多个场景。以下是Zoom使用的基本步骤和注意事项&#xff1a; 一、注册与登录 注册Zoom账户&#xff1a; 访问Zoom官方网站&#xff08;如zoom.us&#xff09;&#xff0c;点击“注册”…

Games101学习笔记 Lecture16 Ray Tracing 4 (Monte Carlo Path Tracing)

Lecture16 Ray Tracing 4 (Monte Carlo Path Tracing 一、蒙特卡洛积分 Monte Carlo Integration二、路径追踪 Path tracing1.Whitted-Style Ray Tracings Problems2.只考虑直接光照时3.考虑全局光照①考虑物体的反射光②俄罗斯轮盘赌 RR &#xff08;得到正确shade函数&#x…

精准畜牧业:多维传感监测及分析动物采食行为

全球畜牧业呈现出一个动态且复杂的挑战。近几十年来&#xff0c;它根据对动物产品需求的演变进行了适应&#xff0c;动物生产系统需要提高其效率和环境可持续性。在不同的畜牧系统中有效行动取决于科学技术的进步&#xff0c;这允许增加照顾动物健康和福祉的数量。精准畜牧业技…

JavaScript-WebAPI

文章目录 JS组成什么是 webApis 和APIDOM 简介document 对象 获取 DOM 对象利用css选择器来获取DOM元素选择指定css选择器的所有元素其他获取DOM元素方法&#xff08;了解&#xff09; 操作元素内容对象.innerText对象.innerHTML 操作元素属性操作元素常用属性操作元素样式属性…

pytorch中的contiguous()

官方文档&#xff1a;https://pytorch.org/docs/stable/generated/torch.Tensor.contiguous.html 其描述contiguous为&#xff1a; Returns a contiguous in memory tensor containing the same data as self tensor. If self tensor is already in the specified memory forma…

羊大师:羊奶养生,解锁健康之道的新密码

在探寻健康与养生的旅途中&#xff0c;我们总渴望找到那把开启健康之门的钥匙。而今&#xff0c;羊奶以其独特的营养价值和健康益处&#xff0c;正悄然成为那把解锁健康之道的新密码。 羊奶&#xff0c;自古以来便是自然赋予的珍贵礼物。它富含优质蛋白、多种维生素及矿物质&am…