pandas教程:Advanced GroupBy Use 高级GroupBy用法

文章目录

  • 12.2 Advanced GroupBy Use(高级GroupBy用法)
  • 1 Group Transforms and “Unwrapped” GroupBys(组变换和无包装的GroupBy)
  • 2 Grouped Time Resampling(分组时间重采样)

12.2 Advanced GroupBy Use(高级GroupBy用法)

我们已经在第十章讨论了groupby的一些用法,这里还有一些技巧可能会用得到。

1 Group Transforms and “Unwrapped” GroupBys(组变换和无包装的GroupBy)

在第十章里,使用apply方法在组上进行转换操作的。还有一个内建的方法叫transform,和apply相同,但是在一些函数的用法上有一些限制:

  • 可以产生一个标量,将数据广播(broadcast)到与组一样的形状(这里的broadcast可以理解为改变数据形状的方法,感兴趣的可以直接搜索 numpy broadcast
  • 可以产生一个和输入的组一样形状的对象
  • 不能对输入进行改变

举个例子:

import numpy as np
import pandas as pd
df = pd.DataFrame({'key': ['a', 'b', 'c'] * 4,'value': np.arange(12.)})
df
keyvalue
0a0.0
1b1.0
2c2.0
3a3.0
4b4.0
5c5.0
6a6.0
7b7.0
8c8.0
9a9.0
10b10.0
11c11.0

通过key来计算组的平均值:

g = df.groupby('key').value
g.mean()
key
a    4.5
b    5.5
c    6.5
Name: value, dtype: float64

假设我们想要产生一个和df['value']一样大小的Series,不过要用key分组后的平均值来替换。我们可以把函数lambda x: x.mean()transform

g.transform(lambda x: x.mean())
0     4.5
1     5.5
2     6.5
3     4.5
4     5.5
5     6.5
6     4.5
7     5.5
8     6.5
9     4.5
10    5.5
11    6.5
Name: value, dtype: float64

对于内建的聚合函数,我们可以传入一个字符串别名,就像使用groupby agg方法的时候一样:

g.transform('mean')
0     4.5
1     5.5
2     6.5
3     4.5
4     5.5
5     6.5
6     4.5
7     5.5
8     6.5
9     4.5
10    5.5
11    6.5
Name: value, dtype: float64

就像applytransform能用那些返回Series的函数,但是结果的大小和输入的必须一样。例如,我们通过一个lambda函数令每个小组都乘2:

g.transform(lambda x: x * 2)
0      0.0
1      2.0
2      4.0
3      6.0
4      8.0
5     10.0
6     12.0
7     14.0
8     16.0
9     18.0
10    20.0
11    22.0
Name: value, dtype: float64

一个更复杂的例子,我们可以按降序来计算每一个组:

g.transform(lambda x: x.rank(ascending=False))
0     4.0
1     4.0
2     4.0
3     3.0
4     3.0
5     3.0
6     2.0
7     2.0
8     2.0
9     1.0
10    1.0
11    1.0
Name: value, dtype: float64

考虑一个包含简单聚合的分组转换函数:

def normalize(x):return (x - x.mean()) / x.std()

使用transformapply,都能得到一样的结果:

g.transform(normalize)
0    -1.161895
1    -1.161895
2    -1.161895
3    -0.387298
4    -0.387298
5    -0.387298
6     0.387298
7     0.387298
8     0.387298
9     1.161895
10    1.161895
11    1.161895
Name: value, dtype: float64
g.apply(normalize)
0    -1.161895
1    -1.161895
2    -1.161895
3    -0.387298
4    -0.387298
5    -0.387298
6     0.387298
7     0.387298
8     0.387298
9     1.161895
10    1.161895
11    1.161895
Name: value, dtype: float64

内建的聚合函数,比如mean, sum经常比一般的apply函数要快。而是用transform的话,会更快一些。这就需要我们使用无包装的组操作(upwrapped group operation):

g.transform('mean')
0     4.5
1     5.5
2     6.5
3     4.5
4     5.5
5     6.5
6     4.5
7     5.5
8     6.5
9     4.5
10    5.5
11    6.5
Name: value, dtype: float64
normalized = (df['value'] - g.transform('mean')) / g.transform('std')
normalized
0    -1.161895
1    -1.161895
2    -1.161895
3    -0.387298
4    -0.387298
5    -0.387298
6     0.387298
7     0.387298
8     0.387298
9     1.161895
10    1.161895
11    1.161895
Name: value, dtype: float64

一个无包装的组操作可能会涉及多个组聚合操作,不过向量化操作会胜过这种操作。

2 Grouped Time Resampling(分组时间重采样)

对于时间序列数据,resample方法是一个基于时间的组操作。这里有一个样本表格:

N = 15
times = pd.date_range('2017-05-20 00:00', freq='1min', periods=N)
df = pd.DataFrame({'time': times, 'value': np.arange(N)})
df
timevalue
02017-05-20 00:00:000
12017-05-20 00:01:001
22017-05-20 00:02:002
32017-05-20 00:03:003
42017-05-20 00:04:004
52017-05-20 00:05:005
62017-05-20 00:06:006
72017-05-20 00:07:007
82017-05-20 00:08:008
92017-05-20 00:09:009
102017-05-20 00:10:0010
112017-05-20 00:11:0011
122017-05-20 00:12:0012
132017-05-20 00:13:0013
142017-05-20 00:14:0014

我们用time索引,然后重采样:

df.set_index('time').resample('5min').count()
value
time
2017-05-20 00:00:005
2017-05-20 00:05:005
2017-05-20 00:10:005

假设一个DataFrame包含多个时间序列,用多一个key列来表示:

df2 = pd.DataFrame({'time': times.repeat(3),'key': np.tile(['a', 'b', 'c'], N), 'value': np.arange(N * 3.)})
df2[:7]
keytimevalue
0a2017-05-20 00:00:000.0
1b2017-05-20 00:00:001.0
2c2017-05-20 00:00:002.0
3a2017-05-20 00:01:003.0
4b2017-05-20 00:01:004.0
5c2017-05-20 00:01:005.0
6a2017-05-20 00:02:006.0

想要对key列的值做重采样,我们引入pandas.TimeGrouper对象:

time_key = pd.TimeGrouper('5min')

然后设置time为索引,对key和time_key做分组,然后聚合:

resampled = (df2.set_index('time').groupby(['key', time_key]).sum())
resampled
value
keytime
a2017-05-20 00:00:0030.0
2017-05-20 00:05:00105.0
2017-05-20 00:10:00180.0
b2017-05-20 00:00:0035.0
2017-05-20 00:05:00110.0
2017-05-20 00:10:00185.0
c2017-05-20 00:00:0040.0
2017-05-20 00:05:00115.0
2017-05-20 00:10:00190.0
resampled.reset_index()
keytimevalue
0a2017-05-20 00:00:0030.0
1a2017-05-20 00:05:00105.0
2a2017-05-20 00:10:00180.0
3b2017-05-20 00:00:0035.0
4b2017-05-20 00:05:00110.0
5b2017-05-20 00:10:00185.0
6c2017-05-20 00:00:0040.0
7c2017-05-20 00:05:00115.0
8c2017-05-20 00:10:00190.0

使用TimeGrouper的一个限制是时间必须是SeriesDataFrame的索引才行。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图形编辑器开发:快捷键的管理

大家好,我是前端西瓜哥。 快捷键操作在图形编辑器中是很高频的操作,能让用户快速高效地执行特定命令,今天讲讲图形编辑器如果管理快捷键。 编辑器 github 地址: https://github.com/F-star/suika 线上体验: https://b…

计算机网络:网络层

0 本节主要内容 问题描述 解决思路 1 问题描述 两大问题(重点,也是难点): 地址管理;路由选择。 1.1 子问题1:地址管理 网络上的这些主机和节点都需要使用一种规则来区分,就相当于是一种身…

说说过量 tcp pure ack 的利弊

tcp 的 ack 实在太多了,如果互联网上 80% 报文是 tcp,那么其中 1/3 的报文都是 ack,此前写过几篇短文,比如 丢弃一些 pure ack 和 注入或利用 pure ack。 简单说,tcp 依靠 ack 提供 self-clock,发送 data …

ARM异常模型

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 — 适合小白入门【目录】ARMv8/ARMv9架构高级进阶-[目录]👈👈👈 — 高级进阶、小白勿买【加群】ARM/TEE…

Docker和Kubernetes:区别与优势对比

在现代软件开发和部署中,Docker和Kubernetes是两个备受关注的技术。本文将对Docker和Kubernetes进行比较,探讨它们的区别和各自的优势。 引言 在过去的几年中,容器技术得到了迅速的发展,并且在现代软件交付和部署中扮演着越来越重…

LVS-DR实验

实验前准备 DR服务器:192.168.188.11 192.168.188.15 NFS服务器:192.168.188.14 Web服务器1:192.168.188.12 Web服务器2:192.168.188.13 Vip:192.168.188.188 客户端:192.168.188.200 配置负载均衡调度…

leetCode 77.组合 + 回溯算法 (bactracking) + 剪枝 + 图解 + 笔记

77. 组合 - 力扣(LeetCode) 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。可以按 任何顺序 返回答案。 示例 1: 输入:n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] …

Unity EventSystem的一些理解和使用

Unity的EventSystem是用于处理用户输入和交互的系统。它是Unity UI系统的核心组件之一,可以用于捕捉和分发各种事件,例如点击、拖拽、按键、射线等。 常用的属性和方法有以下这些: 属性: current: 获取当前的EventSystem实例。…

HuggingFace学习笔记--datasets的使用

目录 1--datasets的使用 1-1--加载数据集 1-2--查看数据集 1-3--打乱和排序数据集 1-4--选择和筛选数据集 1-5--划分数据集 1-6--修改数据集 1-7--导出数据集 1--datasets的使用 1-1--加载数据集 代码: from datasets import load_dataset, load_from_di…

C#中的TaskFactory

在C#中,TaskFactory是一个用于创建异步任务的类。它提供了一种方便的方式来创建Task对象,这些对象表示可以异步执行的操作。TaskFactory类位于System.Threading.Tasks命名空间下。 要使用TaskFactory,您需要导入相应的命名空间: …

uni-app+vue3 封装全局函数(详细完整的方法)

在uni-app和vue3中,我们可以封装全局函数来复用代码。以下是详细的步骤: 首先,我们需要在main.js文件中引入我们封装的全局函数。这样我们就可以在整个项目中使用这些函数。 import globalFunctions from ./globalFunctionsVue.prototype.$g…

Vue简易的车牌输入键盘,可以根据需要修改

效果图如下&#xff1a; 代码如下&#xff1a; <template><div><div class"carNoBoxInput"><div style"padding: 6px;border: 2px solid #fff;border-radius: 6px;margin: 6px 3px 6px 6px;"><input class"inputBox"…

小航助学题库蓝桥杯题库stem选拔赛(23年8月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSD…

利用ambari搭建Hbase高可用

初始环境&#xff1a; 节点名称服务名ambari-hadoop1ambari-hadoop2region serverambari-hadoop3hmater、 region server 计划为ambari-hadoop1添加hmaster&#xff0c;以避免hmaster的单点故障、 step1&#xff1a;添加备用Hmaster step2&#xff1a;选择ambari-hadoop1作为…

【一周AI简讯】OpenAI奥特曼王者归来,马斯克AI模型Grok下周开放测试,ChatGPT语音对话功能向所有用户免费开放

OpenAI奥特曼王者归来&#xff0c;董事会改组 终于&#xff0c;经历大约5天的极限拉扯&#xff0c;年底AI界吃瓜大戏落下帷幕&#xff0c;奥特曼确认回归。 ChatGPT语音对话功能向所有用户免费开放 ChatGPT 语音输入最初于 9 月份推出&#xff0c;标题是“ChatGPT 现在可以看…

尚硅谷大数据项目《在线教育之实时数仓》笔记008

视频地址&#xff1a;尚硅谷大数据项目《在线教育之实时数仓》_哔哩哔哩_bilibili 目录 第10章 数仓开发之DWS层 P066 P067 P068 P069 P070 P071 P072 P073 P074 P075 P076 P077 P078 P079 P080 P081 P082 第10章 数仓开发之DWS层 P066 第10章 数仓开发之DW…

消失的数字,旋转数组(leetcode 一题多解)

目录 一、消失的数字 思路一&#xff08;暴力求解&#xff09;代码实现&#xff1a; 思路二&#xff08;数列的思想&#xff09;代码实现&#xff1a; 思路三&#xff08;异或的运用&#xff09;代码实现&#xff1a; 二、轮转数组 思路一&#xff08;暴力求解&#xff09…

Vue3 + Scss 实现主题切换效果

Vue3 Scss 实现主题切换效果 先给大家看一下主题切换的效果&#xff1a; 像这样的效果实现起来并不难&#xff0c;只是比较麻烦&#xff0c;目前我知道的有两种方式可以实现&#xff0c;分别是 CSS 变量、样式文件切换&#xff0c;下面是该效果的核心实现方法 CSS变量 给…

电脑如何定时关机?

电脑如何定时关机&#xff1f;我承认自己是个相当粗心的人&#xff0c;尤其是在急于离开时经常会忘记关闭电脑&#xff0c;结果就是电量耗尽&#xff0c;导致电脑自动关机。而且&#xff0c;在我使用电脑的时候&#xff0c;经常需要进行软件下载、更新等任务。如果我一直坐等任…

设计模式—迪米特原则(LOD)

1.背景 1987年秋天由美国Northeastern University的Ian Holland提出&#xff0c;被UML的创始者之一Booch等普及。后来&#xff0c;因为在经典著作《 The Pragmatic Programmer》而广为人知。 2.概念 迪米特法则&#xff08;Law of Demeter&#xff09;又叫作最少知识原则&…