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

部分参数表示的含义如下:

  1. by:用于确定进行分组的依据
  2. axis:表示分组轴的方向,可以为0或1,默认为0
  3. level:如果某个轴是一个MultiIndex对象(索引层次结构),则会按特定级别或多个级别分组
  4. as_index:表示聚合后的数据是否以组标签作为索引的DataFrame对象输出,接受布尔值,默认为True
  5. 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()函数会对行索引一列执行求长度的操作,以行索引名称的长度进行分组,则长度相同的行索引名称会分成一组。

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

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

相关文章

超硬核!小白读了这篇文章,就能在算法圈混了

作为一只超级硬核的兔子&#xff0c;从来不给你说废话&#xff0c;只有最有用的干货&#xff01;这些神级算法送给你 目录 第一节 1.1bogo排序 1.2位运算 1.3打擂台 1.4morris遍历 第二节 2.1睡眠排序 2.2会死的兔子 2.3矩阵快速幂 2.4摔手机/摔鸡蛋 时空复杂度目录 …

Python之数据聚合——aggregate()方法

文章目录使用内置统计方法聚合数据面向列的聚合方法aggregate()方法对每一列数据应用同一个函数对某列数据应用不同的函数对不同列数据应用不同函数使用内置统计方法聚合数据 实现数据拆分成组并分别计算平均数的操作 代码&#xff1a; import pandas as pd import numpy as…

超硬核十万字!全网最全 数据结构 代码,随便秒杀老师/面试官,我说的

本文代码实现基本按照《数据结构》课本目录顺序&#xff0c;外加大量的复杂算法实现&#xff0c;一篇文章足够。能换你一个收藏了吧&#xff1f; 当然如果落下什么了欢迎大家评论指出 目录 顺序存储线性表实现 单链表不带头标准c语言实现 单链表不带头压缩c语言实现 约瑟…

Python之分组级运算——【transform()方法、apply()方法】

文章目录数据转换——transform()方法数据应用——apply()方法数据转换——transform()方法 使用aggregate()方法进行聚合运算已经在上一篇博客中详细阐述&#xff0c;我们知道aggregate()方法返回的数据集的形状&#xff08;shape&#xff09;与被分组的数据集的形状是不同的…

java限制在同一台电脑上只允许有一个用户登录系统

在web应用系统中&#xff0c;出于安全性考虑&#xff0c;经常需要对同一客户端登录的用户数量和一个客户同时在多个客户端登陆进行限制。 具体一点就是&#xff1a; 1、在同一台电脑上一次只允许有一个用户登录系统&#xff1b; 2、一个用户在同一时间只允许在一个客户端登录…

Matplotlib——绘制图表

文章目录通过figure()函数创建画布通过subplot()函数创建单个子图通过subplots()函数创建多个子图通过add_subplot()方法添加和选中子图添加各类标签绘制常见图表绘制直方图——hist()函数绘制散点图——scatter()函数绘制柱状图——bar()函数设定线条的相关参数本地保存图片通…

限制在同一台电脑上只允许有一个用户登录系统

在web应用系统中&#xff0c;出于安全性考虑&#xff0c;经常需要对同一客户端登录的用户数量和一个客户同时在多个客户端登陆进行限制。 具体一点就是&#xff1a; 1、在同一台电脑上一次只允许有一个用户登录系统&#xff1b; 2、一个用户在同一时间只允许在一个客户端登录…

Seaborn——绘制统计图形

文章目录可视化数据的分布绘制单变量分布绘制双变量分布绘制成对的双变量分布用分类数据绘图类别散点图通过stripplot()函数画散点图swarmplot()函数类别内的数据分布绘制箱型图绘制提琴图类别内的统计估计绘制条形图绘制点图可视化数据的分布 绘制单变量分布 一般采用最简单…

Bokeh——交互式可视化库

文章目录前言如何通过Plotting绘制图形前言 Bokeh是一个专门针对Web浏览器使用的交互式可视化库&#xff0c;这是与其他可视化库相比最核心的区别。 如何通过Plotting绘制图形 Plotting是以构建视觉符号为核心的接口&#xff0c;可以结合各种视觉元素&#xff08;例如&#x…

指针、引用以及const限定符、constexpr限定符

文章目录复合类型引用概念与使用引用的定义注意指针概念声明方式取地址符指针值空指针利用指针访问对象赋值和指针void* 指针指向指针的指针指向指针的引用初始化所有指针有多重含义的某些符号const限定符概念const的引用指针和const顶层const和底层constconstexpr和常量表达式…

关键字typedef、关键字using、auto类型说明符和declytpe类型指示符

文章目录类型别名概念关键字 typedef别名声明 (alias declaration) using指针、常量和类型别名类型别名简化多维数组指针auto类型说明符概念复合类型、常量和autodecltype类型指示符概念decltype和引用类型别名 概念 有两种方法可用于定义类型别名。 关键字 typedef typede…

初始化、赋值、默认初始化、列表初始化、类内初始值、直接初始化与拷贝初始化

文章目录初始化和赋值的区别什么是默认初始化&#xff1f;列表初始化列表初始化的使用场景不适合使用列表初始化的场景类内初始值混用string对象和C风格字符串数组与vector对象关于vector对象两者间的初始化关系直接初始化与拷贝初始化初始化和赋值的区别 初始化的含义是创建变…

js动态增加,删除td,tr,table,div

js实现的动态添加&#xff0c;删除table内容&#xff1a; 截图如下&#xff1a; 1. 2. 源代码&#xff1a; main.css body {background-image: url(../images/qiantai/bg.png);font-family: arial;font-size: 12px;color: #d4d7da;text-align: center;background-repeat: r…

string类的相关知识及部分操作

文章目录string对象的初始化string::size_type类型string对象的读写操作使用标准库中的iostream使用getline读取一整行string对象的比较操作string对象的相加操作两个string对象相加字面值和string对象相加string对象的初始化 拷贝初始化(copy initialization)&#xff1a;使用…

数组的部分练习

3.27&#xff1a;假设txt_size是一个无参数的函数&#xff0c;它的返回值是int。请回答下列哪个定义是非法的&#xff1f;为什么&#xff1f; unsigned buf_size1024; &#xff08;a&#xff09;int ia[buf_size];  &#xff08;b&#xff09;int ia[4*7-14]; &#xff08…

关于范围for语句的使用

文章目录使用范围for语句处理多维数组使用范围for语句处理多维数组 举个例子&#xff0c;使用范围for语句输出多维数组&#xff08;ia&#xff09;所有值&#xff1a; for (const auto &row : ia)for (auto col : row)cout << col << endl;本循环中并没有任何…

vector的应用练习

文章目录编写一段程序&#xff0c;使用条件运算符从vector< int >中找出哪些元素的值是奇数&#xff0c;然后将奇数值翻倍。 #include <iostream> #include <ctime> #include <vector> using namespace std; typedef int int_array[4]; int main() {v…

sizeof运算符运算结果小汇

文章目录sizeof运算符的结果部分地依赖于其作用的类型sizeof运算符的结果部分地依赖于其作用的类型 对char或者类型为char的表达式执行sizeof运算&#xff0c;结果得1对引用类型执行sizeof运算得到被引用对象所占空间的大小对指针执行sizeof运算得到指针本身所占空间的大小对解…

jQuery实现复选框的全选和反选:

jQuery实现复选框的全选和反选&#xff1a; 截图如下&#xff1a; 代码如下&#xff1a; index.jsp: <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <%String path request.getContextPath();String basePath…

C语言隐式/显式类型转换 | C++四种强制类型转换、类的隐式转换、explicit

文章目录C语言类型转换隐式类型转换显式类型转换C 强制类型转换static_castreinterpret_castconst_castdynamic_cast类的隐式类型转换概念只允许一步类类型转换explicit 抑制构造函数定义地隐式转换可以通过显式转换使用explicit构造函数C语言类型转换 隐式类型转换 编译器在…