Python之数据拆分——groupby()方法
文章目录
- groupby()方法
- 通过列名进行分组
- 通过Series对象进行分组
- Series对象与原数据的行索引长度相等
- Series对象与原数据的行索引长度不等
- 通过字典进行分组
- 按照columns轴的方向进行分组
- 按照index轴的方向进行分组
- 通过函数进行分组
groupby()方法
groupby(
self,
by=None,
axis=0,
level=None,
as_index: bool = True,
sort: bool = True,
group_keys: bool = True,
squeeze: bool = False,
observed: bool = False,
)
部分参数表示的含义如下:
- by:用于确定进行分组的依据
- axis:表示分组轴的方向,可以为0或1,默认为0
- level:如果某个轴是一个MultiIndex对象(索引层次结构),则会按特定级别或多个级别分组
- as_index:表示聚合后的数据是否以组标签作为索引的DataFrame对象输出,接受布尔值,默认为True
- sort:表示是否对分组标签进行排序,接受布尔值,默认为True
通过groupby()方法执行分组操作,会返回一个GroupBy对象,该对象实际上并没有进行任何计算,只是包含一些而关于分组键的中间数据而已。
一般,使用Series调用groupby()方法返回的是SeriesGroupBy对象,而使用DataFrame调用groupby()方法返回的是DataFrameBy对象。
在进行分组时,通过指定by参数来确定分组标准,常用的分组方式主要有四种:
- 列表或数组,其长度必须与待分组的轴一样
- DataFrame对象中某列的名称
- 字典或Series对象,给出待分组轴上的值与分组名称之间的对应关系
- 函数,用于处理轴索引或索引中的各个标签
通过列名进行分组
代码:
import numpy as np
import pandas as pddf = pd.DataFrame({"key": ['C', 'B', 'C', 'A', 'B', 'B', 'A', 'C', 'A'],"Data": [2, 4, 6, 8, 10, 1, 14, 16, 18]})
print(df)
group_obj = df.groupby(by='key')
print("df.groupby(by='key'):\n", group_obj)
输出结果:
key Data
0 C 2
1 B 4
2 C 6
3 A 8
4 B 10
5 B 1
6 A 14
7 C 16
8 A 18
df.groupby(by='key'):<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002018919F2B0>
从输出结果可以看出,DataFrame经过分组之后得到了一个DataFrameGroupBy对象,该对象是一个可迭代的对象,即只有在真正需要的时候才会执行计算(惰性计算)
如果要查看每个分组的具体内容,应该使用for循环遍历DataFrameGroupBy对象。
代码:
for i in group_obj:print(i)
输出结果:
('A', key Data
3 A 8
6 A 14
8 A 18)
('B', key Data
1 B 4
4 B 10
5 B 1)
('C', key Data
0 C 2
2 C 6
7 C 16)
通过Series对象进行分组
Series对象与原数据的行索引长度相等
将Series对象传给by参数,作为分组键拆分DataFrame对象
代码:
df1 = pd.DataFrame({'key1': ['A', 'A', 'B', 'B', 'A'],'kye2': ['one', 'two', 'one', 'two', 'one'],'data1': [2, 3, 4, 6, 8],'data2': [3, 5, 6, 3, 7]})
print(df1)se = pd.Series(['a', 'b', 'c', 'a', 'b'])
group_obj1 = df1.groupby(by=se)
for i in group_obj1:print(i)
输出结果:
key1 kye2 data1 data2
0 A one 2 3
1 A two 3 5
2 B one 4 6
3 B two 6 3
4 A one 8 7('a', key1 kye2 data1 data2
0 A one 2 3
3 B two 6 3)
('b', key1 kye2 data1 data2
1 A two 3 5
4 A one 8 7)
('c', key1 kye2 data1 data2
2 B one 4 6)
从输出结果可以看出,se将df1对象分成a,b,c三组,其中索引0和3对应的两行为a组数据,索引1和4对应的两行为b组数据,索引2对应的一行为c组数据。
Series对象与原数据的行索引长度不等
代码:
se1 = pd.Series(['a', 'b', 'a'])
group_obj2 = df1.groupby(se1)
for i in group_obj2:print("group_obj2:\n", i)
输出结果:
('a', key1 kye2 data1 data2
0 A one 2 3
2 B one 4 6)
('b', key1 kye2 data1 data2
1 A two 3 5)
由于se1只有三行数据,所以它只需要对df对象的前三行数据进行分组,即第一行第三行分为一组,最后一行分为一组,而不会将全部的数据进行分组
通过字典进行分组
用字典对DataFrame进行分组时,需要确定轴的方向及字典中的映射关系,即字典中的键为列名,字典的值为自定义的分组名。
按照columns轴的方向进行分组
代码:
df2 = DataFrame({'a': [1, 2, 4, 8, 3],'b': [9, 6, 3, 7, 5],'c': [2, 3, 4, 6, 8],'d': [3, 5, 6, 3, 7]})
mapping = {'a': '第一组', 'b': '第二组', 'c': '第三组', 'd': '第一组'}
print(df2)
by_columns = df2.groupby(by=mapping, axis=1)
print("by_columns:")
for i in by_columns:print(i)
输出结果:
a b c d
0 1 9 2 3
1 2 6 3 5
2 4 3 4 6
3 8 7 6 3
4 3 5 8 7
by_columns:
('第一组', a d
0 1 3
1 2 5
2 4 6
3 8 3
4 3 7)
('第三组', c
0 2
1 3
2 4
3 6
4 8)
('第二组', b
0 9
1 6
2 3
3 7
4 5)
拆分df2时,将a列、d列数据映射到第一组;将b列映射到第二组,将d列数据映射到第三组。
按照index轴的方向进行分组
代码
mapping1 = {0: '第一组', 1: '第二组', 2: '第三组', 3: '第二组', 4: '第一组'}
by_index = df2.groupby(mapping1, axis=0)
print("by_index:")
for i in by_index:print(i)
输出结果:
by_index:
('第一组', a b c d
0 1 9 2 3
4 3 5 8 7)
('第三组', a b c d
2 4 3 4 6)
('第二组', a b c d
1 2 6 3 5
3 8 7 6 3)
拆分df2时,将0行、4行数据映射到第一组;将1行、3行映射到第二组,将2行数据映射到第三组。
通过函数进行分组
使用函数作为分组键会更加灵活,任何一个被当作分组键的函数都会在各个索引值上被调用一次,返回的值会被用作分组名称。
代码:
df2 = DataFrame({'a': [1, 2, 4, 8, 3],'b': [9, 6, 3, 7, 5],'c': [2, 3, 4, 6, 8],'d': [3, 5, 6, 3, 7]},index=['Bob', 'Alice', 'Job', 'Jack', 'Helen'])
group_obj3 = df2.groupby(by=len)
print("group_obj3")
for i in group_obj3:print(i)
输出结果:
group_obj3
(3, a b c d
Bob 1 9 2 3
Job 4 3 4 6)
(4, a b c d
Jack 8 7 6 3)
(5, a b c d
Alice 2 6 3 5
Helen 3 5 8 7)
在调用groupby()方法时传入了内置函数len(),表明len()函数会对行索引一列执行求长度的操作,以行索引名称的长度进行分组,则长度相同的行索引名称会分成一组。
Python之数据拆分——groupby()方法相关推荐
- 数据分析时进行数据拆分的方法
数据分析时进行数据拆分的方法 # 75%的数据用来做训练集,25%的数据用作测试集 X_train,X_test,y_train,y_test = train_test_split(X,y,test_ ...
- Python之数据聚合——aggregate()方法
文章目录 使用内置统计方法聚合数据 面向列的聚合方法 aggregate()方法 对每一列数据应用同一个函数 对某列数据应用不同的函数 对不同列数据应用不同函数 使用内置统计方法聚合数据 实现数据拆分 ...
- python分析数据差异的方法_用Python的两种方法进行方差分析
在进行数据分析时,我们往往会遇到要对某个变量的影响因素进行分析的情况,而影响一事物的因素往往是很多的.比如在化工生产中,有温度.压力.剂量.反应时间等因素.每一因素的改变都有可能影响产品的数量和质量. ...
- python对数据分组的方法
pandas 的cut函数完成数据分组 cut(Series,bins,right = True,labels = null ) Series:需要分组的数据[数据框的某列数据] bins:分组的划分 ...
- python金融数据导入的方法
初学篇–数据导入 1.国内股票的数据: 2.国际股票的数据: 3.网页的数据: 4.本地的数据传入python分析: (一)数据导入 1.国内股票的数据–tushare包(安装pip install ...
- python之数据拆分与合并
1.代码部分 import pandas as pd#设置列对齐 pd.set_option('display.unicode.ambiguous_as_wide',True) pd.set_opti ...
- python分析数据差异的方法_数据分析技术:数据差异的显著性检验
数据差异的显著性检验是数据分析的重要技术之一.然而,如何正确选择检验方法是很多初学者困惑和容易出现错误的地方.下面为大家总结一下数据差异显著性检验的方法及适用范围. 显著性检验 首先需要理解什么是数据 ...
- Python 简单数据/密码加密方法
# 简单数据加密""" 加密方法:1.获取所有字符ASCII码,进行累加2.拼接所有字符ASCII码,顺序拼接3.把顺序拼接的ASCII码,倒序排列4.把倒序排列的ASC ...
- 美赛O奖大佬的PYTHON的数据预处理基本方法(想要详细资料的或者美赛需要思路以及论文援助的加我哦,vx在简介中)
最新文章
- 剑指Offer面试题:24.复杂链表的复制
- 5 -- Hibernate的基本用法 -- 要点
- C++复习 第一部分c到c++的过度
- c语言 单词变复数_一些复数运算的C语言实现
- vant组件做表格_落户上海!分享心得,再做个积分计算器
- 架构即未来 - 组织的设置 读书笔记
- 富文本编辑器中空格转化为a_文本编辑器题解
- 某人说自己是佛菩萨转世,什么情况下才可信
- SAP官网学习教程(3) HANA数据库开发
- Codeforces Round #507 (Div. 2, based on Olympiad of Metropolises) B. Shashlik Cooking
- 风景照片转水彩画效果PS动作
- [To Selina] 《撒野》读后感
- Java基础案例教程———【任务4-2】模拟物流快递系统
- CIO Mini MBA 阅读管理书籍
- CAST 和 CONVERT
- GDUT——1169: Krito的讨伐(优先队列BFS)
- 李航:做本质的、严谨的、有意思的研究!
- 调用招商银行接口(手把手教程,附调用接口工具类)
- Couchbase 分享 PPT
- 使用mycat搭建实现mysql数据库集群管理
热门文章
- html input p,我想在input.phtml中创建下拉框。 (不要使用zend_form)
- php if require,关于php:required_if Laravel 5验证
- dual mysql 获取序列_MySQL获取周、月、天日期,生成排序号
- a5d27 emmc启动 修改2
- Asterisk NAT
- WinCE BSP的BIB文件介绍
- esp8266 micropython oled_micropython(4):使用ESP8266 控制 oled 屏幕,并显示 helloworld 字符...
- IsPostBack须要注意的地方,这些都不是POSTBACK动作
- .netcore持续集成测试篇之MVC层单元测试
- .NET异步程序设计之任务并行库