Pandas之groupby( )用法笔记小结
作者:Byron_NG 发布时间:2023-03-03 15:58:24
groupby官方解释
DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)
Group series using mapper (dict or key function, apply given function to group, return result as series) or by a series of columns.
讲真的,非常不能理解pandas官方文档的这种表达形式,让人真的有点摸不着头脑,example给得又少,参数也不给得很清楚,不过没有办法,还是只能选择原谅他。
groupby我用过的用法
基本用法我这里就不呈现了,我觉得用过一次的人基本不会忘记,这里我主要写一下我用过的关系groupby函数的疑惑:
apply & agg
这个问题着实困扰了我很久,经过研究,找了一些可能帮助理解的东西。先举一个例子:
import pandas as pd
df = pd.DataFrame({'Q':['LI','ZHANG','ZHANG','LI','WANG'], 'A' : [1,1,1,2,2], 'B' : [1,-1,0,1,2], 'C' : [3,4,5,6,7]})
A | B | C | Q | |
---|---|---|---|---|
0 | 1 | 1 | 3 | LI |
1 | 1 | -1 | 4 | ZHANG |
2 | 1 | 0 | 5 | ZHANG |
3 | 2 | 1 | 6 | LI |
4 | 2 | 2 | 7 | WANG |
df.groupby('Q').apply(lambda x:print(x))
A B C Q
0 1 1 3 LI
3 2 1 6 LI
A B C Q
0 1 1 3 LI
3 2 1 6 LI
A B C Q
4 2 2 7 WANG
A B C Q
1 1 -1 4 ZHANG
2 1 0 5 ZHANG
df.groupby('Q').agg(lambda x:print(x))
0 1
3 2
Name: A, dtype: int64
4 2
Name: A, dtype: int64
1 1
2 1
Name: A, dtype: int64
0 1
3 1
Name: B, dtype: int64
4 2
Name: B, dtype: int64
1 -1
2 0
Name: B, dtype: int64
0 3
3 6
Name: C, dtype: int64
4 7
Name: C, dtype: int64
1 4
2 5
Name: C, dtype: int64
A | B | C | |
---|---|---|---|
Q | |||
LI | None | None | None |
WANG | None | None | None |
ZHANG | None | None | None |
从这个例子可以看出,使用apply()处理的对象是一个个的类如DataFrame的数据表,然而agg()则每次只传入一列。
不过我觉得这一点区别在实际应用中分别并不大,因为Ipython的Out输出对于这两个函数几乎没有差别,不管是处理一列还是一表。
我觉得agg()有一点让我很开心就是他可以同时传入多个函数,简直不要太方便哈哈:
df.groupby('Q').agg(['mean','std','count','max'])
A | B | C | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
mean | std | count | max | mean | std | count | max | mean | std | count | max | |
Q | ||||||||||||
LI | 1.5 | 0.707107 | 2 | 2 | 1.0 | 0.000000 | 2 | 1 | 4.5 | 2.121320 | 2 | 6 |
WANG | 2.0 | NaN | 1 | 2 | 2.0 | NaN | 1 | 2 | 7.0 | NaN | 1 | 7 |
ZHANG | 1.0 | 0.000000 | 2 | 1 | -0.5 | 0.707107 | 2 | 0 | 4.5 | 0.707107 | 2 | 5 |
Plotting
这个也是我刚刚学会的,groupby的plot简直不要太方便了:(不过这个例子选的不是很好)
%matplotlib inline
df.groupby('Q').agg(['mean','std','count','max']).plot(kind='bar')
<matplotlib.axes._subplots.AxesSubplot at 0x1133bd710>
MultiIndex
这个是困扰我最多的一个问题,因为如果我groupby的时候选择了两个level,之后的data总是呈现透视表的形式,如:
Muldf = df.groupby(['Q','A']).agg('mean')
print(Muldf)
B C
Q A
LI 1 1.0 3.0
2 1.0 6.0
WANG 2 2.0 7.0
ZHANG 1 -0.5 4.5
我开始甚至以为这应该不是dataframe,是一个我可能没注意过的一个东西,可是后来我发现,这不过是MultiIndex形式的一种dataframe罢了。
Muldf.B
Q A
LI 1 1.0
2 1.0
WANG 2 2.0
ZHANG 1 -0.5
Name: B, dtype: float64
如果要选择某一个index,用`xs()`函数:
Muldf.xs('LI')
B | C | |
---|---|---|
A | ||
1 | 1.0 | 3.0 |
2 | 1.0 | 6.0 |
PS:有个问题困扰好久了,怎么把multiindex对象变回原来的形式呢。如:
Multiindex格式如下:(a, b, c, ...),
index | column |
(a1,b1,c1) | d1 |
(a2,b2,c2) | d2 |
直接调用函数reset_index(),Multiindex中(a, b, c, ...)就变成columns了,index重置为(0,1,2,...), 如下:
index | column | |||
0 | a1 | b1 | c1 | d1 |
1 | a2 | b2 | c2 | d2 |
来源:https://www.cnblogs.com/bjwu/p/8970818.html


猜你喜欢
- 看这篇文章前需要先了解一下以下几个问题~一、问题1.分区是什么分区:就是把一张表数据分块存储目的:提升索引的查询效率2.Mysql为什么要使
- Memoization 是一种将函数返回值缓存起来的方法,在 Lisp, Ruby, Perl, Python 等语言中使用非常广泛。随着
- 本文实例总结了python调用函数、类和文件操作。分享给大家供大家参考,具体如下:调用函数有三种方式一,导入整个模块(所有函数)导入 imp
- 一点背景知识OpenCV 是一个开源的计算机视觉和机器学习库。它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包。根据这个
- 一个不错的文字放大特性源码。效果图:运行代码框<script for=document event=onmousemove>//
- 四、 用户注册(reg.php)在看用户注册之流程之前,我把表的用途做个简单说明,现在只是大概的说明,后面我们再仔细了解,大家可以记下这个说
- 网站中很多表单都会用到上传图片,logo,照片,用户也会上传图片,这个时候网站就需要一个上传图片的功能,而且在上传后希望能预览一下看上传的对
- Firefox 2.0 在对 XML 的支持方面有几个重要的改进。目前它的用户部署如日中天。了解 Firefox 2.0 XML 特性的改进
- 本文实例讲述了Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能。分享给大家供大家参考,具体如下:公司要写一些
- 当出现直接在pycharm安装一个包很久装不上或者直接失败时,我们选择另一种方式。例如安装pandas包:win+r输入cmd,在cmd中输
- 关于多线程的大概讲解:在Python的标准库中给出了2个模块:_thread和threading,_thread是低级模块不支持守护线程,当
- MySQL支持的两种主要表存储格式MyISAM,InnoDB,上个月做个项目时,先使用了InnoDB,结果速度特别慢,1秒钟只能插入10几条
- 总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块。python没有二进制类型,但可以存储二进
- 我在Window XP中安装了Gvim7.2,然后桌面上出现了三个快捷方式,gvim72.exe,gvim read-only,gvim e
- enumerate函数用于遍历序列中的元素以及它们的下标。enumerate函数说明:函数原型:enumerate(sequence, [s
- 前言yolo算法作为one-stage领域的佼佼者,采用anchor-based的方法进行目标检测,使用不同尺度的anchor直接回归目标框
- 本文为大家分享了pygame游戏之旅的第3篇,供大家参考,具体内容如下载入car图片(我自己画的),需要用到pygame.image模块,定
- 假设我们有一个数据集,列名叫status下面有100万的数据,其中包装 “HUMAN_REFUSE”,”SYS_REFUSE”,”HUMAN
- 前言我第一次见到飞机大战是在我小学五年级下半学期的时候(2020年),这个游戏中可以说包含了几乎所有我目前可接触到的pygame知识。一、p
- 1.启动数据库命令行客户端#linux命令,注意区分大小写mysql2.查询数据库#执行结果:返回所有数据库列表SHOW DATABASES