文章目录

  • 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()函数会对行索引一列执行求长度的操作,以行索引名称的长度进行分组,则长度相同的行索引名称会分成一组。

Python之数据拆分——groupby()方法相关推荐

  1. 数据分析时进行数据拆分的方法

    数据分析时进行数据拆分的方法 # 75%的数据用来做训练集,25%的数据用作测试集 X_train,X_test,y_train,y_test = train_test_split(X,y,test_ ...

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

    文章目录 使用内置统计方法聚合数据 面向列的聚合方法 aggregate()方法 对每一列数据应用同一个函数 对某列数据应用不同的函数 对不同列数据应用不同函数 使用内置统计方法聚合数据 实现数据拆分 ...

  3. python分析数据差异的方法_用Python的两种方法进行方差分析

    在进行数据分析时,我们往往会遇到要对某个变量的影响因素进行分析的情况,而影响一事物的因素往往是很多的.比如在化工生产中,有温度.压力.剂量.反应时间等因素.每一因素的改变都有可能影响产品的数量和质量. ...

  4. python对数据分组的方法

    pandas 的cut函数完成数据分组 cut(Series,bins,right = True,labels = null ) Series:需要分组的数据[数据框的某列数据] bins:分组的划分 ...

  5. python金融数据导入的方法

    初学篇–数据导入 1.国内股票的数据: 2.国际股票的数据: 3.网页的数据: 4.本地的数据传入python分析: (一)数据导入 1.国内股票的数据–tushare包(安装pip install ...

  6. python之数据拆分与合并

    1.代码部分 import pandas as pd#设置列对齐 pd.set_option('display.unicode.ambiguous_as_wide',True) pd.set_opti ...

  7. python分析数据差异的方法_数据分析技术:数据差异的显著性检验

    数据差异的显著性检验是数据分析的重要技术之一.然而,如何正确选择检验方法是很多初学者困惑和容易出现错误的地方.下面为大家总结一下数据差异显著性检验的方法及适用范围. 显著性检验 首先需要理解什么是数据 ...

  8. Python 简单数据/密码加密方法

    # 简单数据加密""" 加密方法:1.获取所有字符ASCII码,进行累加2.拼接所有字符ASCII码,顺序拼接3.把顺序拼接的ASCII码,倒序排列4.把倒序排列的ASC ...

  9. 美赛O奖大佬的PYTHON的数据预处理基本方法(想要详细资料的或者美赛需要思路以及论文援助的加我哦,vx在简介中)

最新文章

  1. 剑指Offer面试题:24.复杂链表的复制
  2. 5 -- Hibernate的基本用法 -- 要点
  3. C++复习 第一部分c到c++的过度
  4. c语言 单词变复数_一些复数运算的C语言实现
  5. vant组件做表格_落户上海!分享心得,再做个积分计算器
  6. 架构即未来 - 组织的设置 读书笔记
  7. 富文本编辑器中空格转化为a_文本编辑器题解
  8. 某人说自己是佛菩萨转世,什么情况下才可信
  9. SAP官网学习教程(3) HANA数据库开发
  10. Codeforces Round #507 (Div. 2, based on Olympiad of Metropolises) B. Shashlik Cooking
  11. 风景照片转水彩画效果PS动作
  12. [To Selina] 《撒野》读后感
  13. Java基础案例教程———【任务4-2】模拟物流快递系统
  14. CIO Mini MBA 阅读管理书籍
  15. CAST 和 CONVERT
  16. GDUT——1169: Krito的讨伐(优先队列BFS)
  17. 李航:做本质的、严谨的、有意思的研究!
  18. 调用招商银行接口(手把手教程,附调用接口工具类)
  19. Couchbase 分享 PPT
  20. 使用mycat搭建实现mysql数据库集群管理

热门文章

  1. html input p,我想在input.phtml中创建下拉框。 (不要使用zend_form)
  2. php if require,关于php:required_if Laravel 5验证
  3. dual mysql 获取序列_MySQL获取周、月、天日期,生成排序号
  4. a5d27 emmc启动 修改2
  5. Asterisk NAT
  6. WinCE BSP的BIB文件介绍
  7. esp8266 micropython oled_micropython(4):使用ESP8266 控制 oled 屏幕,并显示 helloworld 字符...
  8. IsPostBack须要注意的地方,这些都不是POSTBACK动作
  9. .netcore持续集成测试篇之MVC层单元测试
  10. .NET异步程序设计之任务并行库