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

文章目录

  • 使用内置统计方法聚合数据
  • 面向列的聚合方法
    • aggregate()方法
    • 对每一列数据应用同一个函数
    • 对某列数据应用不同的函数
    • 对不同列数据应用不同函数


使用内置统计方法聚合数据

实现数据拆分成组并分别计算平均数的操作

代码:

import pandas as pd
import numpy as npdf = pd.DataFrame({'key1': ['A', 'A', 'B', 'B', 'A'],'key2': ['one', 'two', 'one', 'two', 'one'],'data1': [2, 3, 4, 6, 8],'data2': [3, 5, np.nan, 3, 7]})
print(df.groupby('key1').mean())

输出结果:

         data1  data2
key1                 
A     4.333333    5.0
B     5.000000    3.0

可以看到的是,如果参与运算的数据中有NaN值,会自动将这些NaN值过滤掉


面向列的聚合方法

当内置方法无法满足聚合要求时,可以自定义一个函数,将它传给agg()方法(pandas 0.20版本后,aggregate()方法与agg()方法用法一样)。

aggregate()方法

aggregate(self, func=None, *args, **kwargs)

上述方法中部分参数表示的含义如下:

  1. func:表示用于汇总数据的函数,可以为单个函数或函数列表
  2. axis:表示函数作用于轴的方向,0或1,index或columns

通过aggregate()方法进行聚合时,func参数既可以接受Pandas中的内置方法,也可以接受自定义的函数,同时,这些方法与函数可以作用于每一列,也可以将多个函数或方法作用于同一列,还可以将不同函数或方法作用于不同的列


对每一列数据应用同一个函数

创建测试对象:

df1 = DataFrame(np.arange(36).reshape(6, 6),columns=list('abcdef'))
df1['key'] = Series(list('aaabbb'), name='key')
print(df1)

输出结果:

 a   b   c   d   e   f key
0   0   1   2   3   4   5   a
1   6   7   8   9  10  11   a
2  12  13  14  15  16  17   a
3  18  19  20  21  22  23   b
4  24  25  26  27  28  29   b
5  30  31  32  33  34  35   b

接下来对测试对象以“key“列为分组键进行拆分,并通过字典的形式分别打印出每个分组的具体内容。

进行拆分

df1_group = df1.groupby(by='key')
print(dict([i for i in df1_group])['a'])
print(dict([i for i in df1_group])['b'])

输出结果:

 a   b   c   d   e   f key
0   0   1   2   3   4   5   a
1   6   7   8   9  10  11   a
2  12  13  14  15  16  17   aa   b   c   d   e   f key
3  18  19  20  21  22  23   b
4  24  25  26  27  28  29   b
5  30  31  32  33  34  35   b

上述过程中,先调用groupby()方法,按key一列的数据将df1对象进行分为a、b两组,然后使用列表推导式([i for i in df1_group])遍历分组对象df1_group,得到每个分组的列表,之后将装有分组的列表强转换为字典,其中字典中的键为a和b,字典的值分别为分组的具体内容。之后通过“字典[组名]”的形式,分别查看a、b组数据。


当然也可以用for循环直接两组一起输出

for i in df1_group:print(i)

输出结果

('a',     a   b   c   d   e   f key
0   0   1   2   3   4   5   a
1   6   7   8   9  10  11   a
2  12  13  14  15  16  17   a)
('b',     a   b   c   d   e   f key
3  18  19  20  21  22  23   b
4  24  25  26  27  28  29   b
5  30  31  32  33  34  35   b)


接下来,对每个分组的数据进行聚合运算。

调用内置的求和方法sum():

print("sum:\n", df1_group.aggregate(sum))

输出结果:

sum:a   b   c   d   e   f
key                        
a    18  21  24  27  30  33
b    72  75  78  81  84  87

自定义一个实现求极差值(极差值 = 最大值 - 最小值)的函数,然后将其作为参数传入aggregate()方法中:

def range_df1_group(arr):return arr.max() - arr.min()print("极差值:\n", df1_group.aggregate(range_df1_group))

输出结果:

极差值:a   b   c   d   e   f
key                        
a    12  12  12  12  12  12
b    12  12  12  12  12  12

对某列数据应用不同的函数

如今要求不仅要求出每组数据的极差,还要计算出每组数据的和。这是可将两个函数的名称放在列表中,之后在调用aggregate()方法聚合时作为参数传入即可。

代码实现:

print("sum and 极差值:\n", df1_group.aggregate(func=[sum, range_df1_group]))

输出结果:

sum and 极差值:a                   b  ...               e   f                sum range_df1_group sum  ... range_df1_group sum range_df1_group
key                          ...                                    
a    18              12  21  ...              12  33              12
b    72              12  75  ...              12  87              12[2 rows x 12 columns]

从输出结果可以看出,生成的DataFrame对象具有两层索引,每个外层列索引包含两个内层列索引,分别以函数的名称range_df1_group和sum命名。

虽然每一列可以应用不同的函数,但是结果并不能很直观地辨别出每个函数代表的意义。为了更好地反映出每列对应地数据的信息, 可以使用“(name,function)”元组将function(函数名)替换为name(自定义名称)。

代码实现:

print("极差值 and sum:\n", 
df1_group.aggregate([("极差", range_df1_group), ("和", sum)]))

输出结果:

极差值 and sum:a       b       c       d       e       f    极差   和  极差   和  极差   和  极差   和  极差   和  极差   和
key                                                
a    12  18  12  21  12  24  12  27  12  30  12  33
b    12  72  12  75  12  78  12  81  12  84  12  87

区别其实就是不会出现列名过长导致的无法显示全的问题了


对不同列数据应用不同函数

如果希望实现对不同列数据应用不同函数,咋可以在aggregate()方法中传入一个{“列名”:“函数名”}格式的字典。

代码实现:

print("综合:\n", 
df1_group.aggregate({'a': 'sum', 'b': range_df1_group, 'c': 'mean'})

输出结果:

综合:a   b   c
key            
a    18  12   8
b    72  12  26

上例中,使用不同的函数对每个分组执行聚合运算,其中a列执行求和运算,b列执行求极差计算,c列执行求平均值计算。自定义函数不需要加引号。


aggregate()方法执行聚合操作时,会将一组标量值参与某些运算后转换为一个标量值。

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

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

相关文章

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

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

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

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

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

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

Matplotlib——绘制图表

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

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

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

Seaborn——绘制统计图形

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

Bokeh——交互式可视化库

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

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

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

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

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

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

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

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

js实现的动态添加,删除table内容: 截图如下: 1. 2. 源代码: 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):使用…

数组的部分练习

3.27:假设txt_size是一个无参数的函数,它的返回值是int。请回答下列哪个定义是非法的?为什么? unsigned buf_size1024; (a)int ia[buf_size];  (b)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语言类型转换 隐式类型转换 编译器在…

string对象和C风格字符串

混用string对象和C风格字符串 我们都知道允许使用字符串字面值来初始化string对象&#xff1a; string s("Hello World!");C规定&#xff0c;任何出现字符串字面值的地方都可以用以空字符结束的字符数组来替代&#xff1a; 允许使用以空字符结束的字符数组来初始化…

函数重载、引用再探、内联函数

文章目录函数重载为什么C支持重载&#xff0c;C语言不支持呢&#xff1f;extern “C”引用再探引用的特性引用的使用场景引用和指针引用和指针的不同点:内联函数什么是内联函数&#xff1f;内联函数的特性内联函数的好处类的内联成员函数的声明内联函数的使用constexpr函数概念…