[数据挖掘02] pandas的分配和聚合函数(1)

news2024/12/24 20:51:14

一 说明

        窗口函数是什么?窗口函数是时间序列的局部属性处理函数,比如,一维卷积滤波、移动平均、指数平均本篇我们将针对pandas对象的窗口函数展开讨论,并以示例展示他们的概念实质。

二  窗口函数、分组函数( GroupBy & window )

2.1 窗口函数表

        因为Series是一维时间序列,因此,我们将主要对Series内部窗口函数进行描述,至于dataframe数据,我们将按此处理,不会有错。

Series.apply(func[, convert_dtype, args])

对 Series 的值调用函数。

Series.agg([func, axis])

在指定轴上使用一个或多个操作进行聚合。

Series.aggregate([func, axis])

在指定轴上使用一个或多个操作进行聚合。

Series.transform(func[, axis])

调用 self 函数生成一个与 self 具有相同轴形状的series。

Series.map(arg[, na_action])

根据输入映射或函数映射 Series 的值。

Series.groupby([by, axis, level, as_index, ...])

使用映射器或按一系列列对系列进行分组。

Series.rolling(window[, min_periods, ...])

提供滚动窗口计算。

Series.expanding([min_periods, axis, method])

提供扩展窗口计算。

Series.ewm([com, span, halflife, alpha, ...])

提供指数加权 (EW) 计算。

Series.pipe(func, *args, **kwargs)

应用需要 Series 或 DataFrames 的可链接函数。

2.2 分配性函数和聚合性函数

        我们将时间序列的处理分成两种情况:

1)分配性函数

        一种情况是将时间序列的每一个元素进行某种操作(如map、apply)。这好比浇树,要对每一个树进行浇灌。

2)聚合性函数

        另一个操作,是对时间函数的每一个元素进行积累,我们关心的是总量(agg、transformer)。这好比摘果实,我们不关心每一棵树的停留,而是关心一片树的果实总量(果堆)。

三  窗口函数使用案例

3.1 我们先生成一个表格和数据

下列代码生成数据:

data = pd.DataFrame({
    '姓名': ['吉米', '吉米', '吉米','杰克', '杰克', '杰克', '麦克', '麦克','麦克' ],
    '科目': ['语文', '数学', '英语', '语文', '数学', '英语', '语文', '数学', '英语'],
    '分数': [80, 90, 70, 60, 75, 85,77,92,88],
})

   姓名  科目  分数
0  吉米  语文  80
1  吉米  数学  90
2  吉米  英语  70
3  杰克  语文  60
4  杰克  数学  75
5  杰克  英语  85
6  麦克  语文  77
7  麦克  数学  92
8  麦克  英语  88

3.2 Series.map函数

        series.map是最简单的元素操作函数。复杂操作用apply。操作后原数据长度不变。

1)函数原型

Series.map(argna_action=None)[source]

2) 参数表:

案例1:基于回调函数的map映射 

def me_power(data):
    return data**2
df = data['分数'].map(me_power)
print(df)

结果:

0    6400
1    8100
2    4900
3    3600
4    5625
5    7225
6    5929
7    8464
8    7744 

 案例2:基于字典的map映射

import pandas as pd
from pandas import Series, DataFrame

data = DataFrame({'food':['bacon','pulled pork','bacon','Pastrami',
            'corned beef','Bacon','pastrami','honey ham','nova lox'],
                  'ounces':[4,3,12,6,7.5,8,3,5,6]})
meat_to_animal = {
    'bacon':'pig',
    'pulled pork':'pig',
    'pastrami':'cow',
    'corned beef':'cow',
    'honey ham':'pig',
    'nova lox':'salmon'    }  

data['animal'] = data['food'].map(str.lower).map(meat_to_animal) 
data   

data['food'].map(lambda x: meat_to_animal[x.lower()])   

          food  ounces
0        bacon     4.0
1  pulled pork     3.0
2        bacon    12.0
3     Pastrami     6.0
4  corned beef     7.5
5        Bacon     8.0
6     pastrami     3.0
7    honey ham     5.0
8     nova lox     6.0 

运算结果 

          food  ounces  animal
0        bacon     4.0     pig
1  pulled pork     3.0     pig
2        bacon    12.0     pig
3     Pastrami     6.0     cow
4  corned beef     7.5     cow
5        Bacon     8.0     pig
6     pastrami     3.0     cow
7    honey ham     5.0     pig
8     nova lox     6.0  salmon 

3.3 Series.apply函数

        与series.map类似,但更加复杂,有更多的参数输入。

1)函数原型

        Series.apply(funcconvert_dtype=Trueargs=()**kwargs)

2)参数表

函数参数参数意义类型
func回调函数(Python,Numpy类型)函数指针
convert_dtype

尝试为元素函数结果找到更好的数据类型。如果为 False,则保留为 dtype=object。请注意,对于某些扩展数组数据类型,例如分类数据类型,数据类型始终保留。

布尔
args

在系列值之后传递给 func 的位置参数。

int
**kwargs

传递给 func 的附加关键字参数。

列表

3)Series.apply()是pandas中的函数,它可以将一个函数应用到Series中的每个元素,并返回一个新的Series。

4)举例:

        下面是一个使用案例,假设有一个Series,它表示若干个人的年龄:

import pandas as pd

ages = pd.Series([18, 25, 41, 32, 27])

        现在我们想将这些年龄进行分组,把年龄小于等于30岁的人分为一组,大于30岁的人分为另一组。我们可以定义一个函数来实现:

def age_group(age):
    if age <= 30:
        return 'young'
    else:
        return 'middle-aged'

        然后使用Series.apply()将这个函数应用到ages中的每个元素:

        groups = ages.apply(age_group)

        最终得到的groups就是一个新的Series,它的每个元素表示对应年龄所属的分组:

print(groups)

# 输出:
# 0          young
# 1          young
# 2    middle-aged
# 3    middle-aged
# 4          young
# dtype: object

        这个例子展示了如何使用Series.apply()将一个自定义函数应用到Series中的每个元素,并返回一个新的Series。

Pandas教程 | 数据处理三板斧——map、apply、applymap详解 - 知乎 (zhihu.com)

3.4 Series.agg函数

1)函数原型

        Series.agg(func=Noneaxis=0*args**kwargs)[source]#

2)参数表      

        Pandas的Series.agg函数是用于对一维数据进行聚合操作的函数。它可以对Series进行多种聚合操作,例如求和、平均值、最大值、最小值等。下面是一个示例:

        假设有一个Series对象a,它包含了一些数值:

import pandas as pd
import numpy as np
a = pd.Series([1, 2, 3, 4, 5])

我们可以用agg函数对这个Series进行求和、平均值和标准差的操作:

print(a.agg('sum'))  # 求和
print(a.agg('mean')) # 平均值
print(a.agg('std'))  # 标准差

输出结果为:

15

3.0

1.5811388300841898

我们也可以使用numpy提供的函数进行聚合操作:

print(a.agg(np.sum))  # 求和
print(a.agg(np.mean)) # 平均值
print(a.agg(np.std))  # 标准差

输出结果同样为:

15
3.0
1.5811388300841898

        除了使用字符串和numpy函数进行聚合操作外,我们还可以使用lambda函数来定义聚合操作:

print(a.agg(lambda x: x.sum() - x.mean())) # 求和减去平均值

        输出结果为:

10.0

        以上就是使用Series.agg函数对一维数据进行聚合操作的示例。

3.5 series.aggragate函数

        与series.agg同。

1)函数原型:

        Series.aggregate(func=Noneaxis=0*args**kwargs)

        这是一个示例代码:

import pandas as pd

# 创建一个Series
s = pd.Series([1, 2, 3, 4, 5])

# 定义一个函数,用于计算平均值、中位数和最大值
def my_agg(x):
    return {'mean': x.mean(), 'median': x.median(), 'max': x.max()}

# 使用aggregate函数对Series进行聚合操作
result = s.aggregate(my_agg)

print(result)

        这个代码创建了一个包含5个元素的Series,并定义了一个名为my_agg的函数,该函数接受一个Series并返回包含平均值、中位数和最大值的字典。

        然后,使用aggregate函数将my_agg函数应用于Series,并将结果存储在一个字典中。最后,将结果打印出来。

        输出结果为:

        {'mean': 3.0, 'median': 3.0, 'max': 5}

        这是平均值、中位数和最大值的结果。

3.6、Series.transform函数

        有时候我们需要对dataframe进行groupby操作,但序列长度不变。这一点用agg不能完成,因此用transform实现。

1)函数原型:

        Series.transform(funcaxis=0*args**kwargs)

2)参数表

3)非聚合操作示例代码 

import pandas as pd
import numpy as np
data = pd.DataFrame({
    '姓名': ['吉米', '吉米', '吉米','杰克', '杰克', '杰克', '麦克', '麦克','麦克' ],
    '科目': ['语文', '数学', '英语', '语文', '数学', '英语', '语文', '数学', '英语'],
    '分数': [80, 90, 70, 60, 75, 85,77,92,88],
})
print(data)

data['分数-对数'] = data['分数'].transform(np.log)
print(data)

数据结果:

0  吉米  语文  80
1  吉米  数学  90
2  吉米  英语  70
3  杰克  语文  60
4  杰克  数学  75
5  杰克  英语  85
6  麦克  语文  77
7  麦克  数学  92
8  麦克  英语  88

直接对分数取了对数。 

   姓名  科目  分数     分数-对数
0  吉米  语文  80  4.382027
1  吉米  数学  90  4.499810
2  吉米  英语  70  4.248495
3  杰克  语文  60  4.094345
4  杰克  数学  75  4.317488
5  杰克  英语  85  4.442651
6  麦克  语文  77  4.343805
7  麦克  数学  92  4.521789
8  麦克  英语  88  4.477337 

2)多目标函数操作

import pandas as pd
import numpy as np
data = pd.DataFrame({
    '姓名': ['吉米', '吉米', '吉米','杰克', '杰克', '杰克', '麦克', '麦克','麦克' ],
    '科目': ['语文', '数学', '英语', '语文', '数学', '英语', '语文', '数学', '英语'],
    '分数': [80, 90, 70, 60, 75, 85,77,92,88],
})
print(data)


df = data['分数'].transform([np.log, lambda s: s+1, np.sqrt])
print(df)

结果:


        log  <lambda>      sqrt
0  4.382027        81  8.944272
1  4.499810        91  9.486833
2  4.248495        71  8.366600
3  4.094345        61  7.745967
4  4.317488        76  8.660254
5  4.442651        86  9.219544
6  4.343805        78  8.774964
7  4.521789        93  9.591663
8  4.477337        89  9.380832

3)先groupby然后求平均

import pandas as pd
import numpy as np
data = pd.DataFrame({
    '姓名': ['吉米', '吉米', '吉米','杰克', '杰克', '杰克', '麦克', '麦克','麦克' ],
    '科目': ['语文', '数学', '英语', '语文', '数学', '英语', '语文', '数学', '英语'],
    '分数': [80, 90, 70, 60, 75, 85,77,92,88],
})
print(data)

data['均分']= data.groupby('姓名')[['分数' ]].transform('mean')
print(data)

 结果数据:

  姓名  科目  分数         均分
0  吉米  语文  80  80.000000
1  吉米  数学  90  80.000000
2  吉米  英语  70  80.000000
3  杰克  语文  60  73.333333
4  杰克  数学  75  73.333333
5  杰克  英语  85  73.333333
6  麦克  语文  77  85.666667
7  麦克  数学  92  85.666667
8  麦克  英语  88  85.666667 

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

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

相关文章

2023年18个最佳的ChatGPT AI插件

​关注文章下方公众号&#xff0c;可免费获取AIGC最新学习资料 导读&#xff1a;ChatGPT已经将人工智能提升到了一个新的高度。ChatGPT 4不仅是聊天机器人&#xff0c;还可以很好地与第三方插件配合使用。我们挑选出了2023年目前18款最佳的插件来介绍给您。 本文字数&#xff…

【运维知识进阶篇】Ansible Jinja2模板详解

哈喽大家好&#xff0c;我是koten&#xff0c;本篇文章给大家介绍jinja2模板&#xff0c;这是python的全功能模板引擎。在Ansible中&#xff0c;通常会使用jinja2模板来修改被管理主机的配置文件&#xff08;saltstack中也会用到&#xff09; Ansible中使用的jinja2模板其实就…

【软件测试】软件测试管理

软件测试管理 软件测试环境测试环境的要素测试环境管理员 软件测试计划⭐测试计划目标测试计划主题测试计划制订过程定义工作进度的过程测试策略 软件缺陷(bug)管理缺陷的主要属性如何报告缺陷⭐如何跟踪缺陷缺陷度量 软件配置管理&#xff08;SCM&#xff09;软件配置管理的基…

计算机网络传输层1.0

功能 传输层提供进程到进程的逻辑通信 复用和分用 传输层对收到的报文进行差错检测 TCP/UDP 提供进程到进程的逻辑通信 网络层是提供主机间逻辑通信 从网络层来看&#xff0c;通信双方为两台主机&#xff0c;IP数据包首部给出两台主机的IP地址 而实际上的两台主机通信时两台…

Makefile路径处理:执行路径、绝对路径与相对路径的处理

问题描述 最近编写了一个 编译设备树 的 Makefile&#xff0c;遇到了使用 make -f xx/Makefile&#xff0c;执行路径变了&#xff0c;造成 Makefile 里面的一些操作路径不正确&#xff0c;无法执行 获取当前目录 make 内置的 $(CURDIR)&#xff0c;可以把当前路径的全路径打印…

Three.js--》实现图片转3D效果展示

目录 项目搭建 初始化three.js基础代码 加载图片纹理 设置着色器 今天简单实现一个three.js的小Demo&#xff0c;加强自己对three知识的掌握与学习&#xff0c;只有在项目中才能灵活将所学知识运用起来&#xff0c;话不多说直接开始。 项目搭建 本案例还是借助框架书写th…

逻辑推理与集合

逻辑推理与集合是同一个过程的不同展示方式&#xff0c;这两者具有不同的特点。 逻辑推理通常是一种思维过程、语言文本的形式。 而集合则很容易采用一种可视化的方式进行展示&#xff0c;并且集合很容易进行交集、并集、补集、差集等计算。 把语言的逻辑推理过程转换为集合…

0602-指针和数组

数组名 数组名是一个地址常量&#xff0c;不允许赋值。它表示数组首元素的地址。 指针操作数组元素 指针访问数组 指针类型变量\常量1等同于指针保存的内存地址sizeof(指针指向的数据类型)。 2个相同类型的指针相减&#xff0c;得到的结果是2个指针的偏移量。其中偏移单位…

STL模型转有限元网格

随着计算机图形学、硬件和3D打印技术的发展&#xff0c;基于曲面三角网格的图形渲染及其文件格式越来越流行。 在有限元分析&#xff08;FEA&#xff09;中&#xff0c;工程师有时会得到基于三角形网格的几何文件&#xff08;如STL文件等&#xff09;并进行后续分析。 由于曲面…

华为OD机试真题 Java 实现【检查是否存在满足条件的数字组合】【2022Q4 100分】

一、题目描述 给定一个正整数数组&#xff0c;检查数组中是否存在满足规则的数字组合 规则&#xff1a;A B 2C 二、输入描述 第一行输出数组的元素个数。 接下来一行输出所有数组元素&#xff0c;用空格隔开。 三、输出描述 如果存在满足要求的数&#xff0c;在同一行…

【MySQL】不允许你不会SQL语句之DDL

目录 前言&#xff1a; 一.DDL数据库语句 1.1语句讲解 1.2总结 二.DDL表语句 2.1语句讲解 2.2总结 三.DDL字段语句 3.1语句讲解 3.2总结 四.MySQL数据类型 五.结尾 前言&#xff1a; 在从零到一入门MySQL一篇中&#xff0c;我们对数据库已经有了一定的了解&#xf…

Linux 设备树手动反编译 dtb 生成 源文件dts

验证平台 win10 64 位 VMware Workstation Pro 16 ubuntu 20.04 dtc 工具&#xff1a; 来自 linux-6.3.5 中的 scripts/dtc/ 安装 dtc 工具 其实可以通过安装 dtc 软件包&#xff0c;但不建议这么做&#xff0c;最好通过编译Linux 最新的内核&#xff0c;获取这个 dtc 工具…

利用Web Serial API实现Vue与单片机串口通信

一、Web Serial API介绍 Web Serial API 是一项 Web 技术&#xff0c;用于在浏览器中访问串行端口设备&#xff08;如 Arduino、传感器等&#xff09;并与之通信。它提供了一组 JavaScript 接口&#xff0c;使得 Web 应用程序可以通过 USB 串行端口连接到硬件设备&#xff0c;并…

华为OD机试真题 Java 实现【报数游戏】【2022Q4 100分】

一、题目描述 100个人围成一圈&#xff0c;每个人有一个编码&#xff0c;编号从1开始到100。他们从1开始依次报数&#xff0c;报到为M的人自动退出圈圈&#xff0c;然后下一个人接着从1开始报数&#xff0c;直到剩余的人数小于M。请问最后剩余的人在原先的编号为多少&#xff…

【JavaSE】Java基础语法(四十五):TCP UDP 全解

文章目录 1. TCP发送数据2. TCP接收数据【应用】3. TCP程序练习4. TCP程序文件上传练习【应用】5. UDP发送数据6. UDP接收数据【应用】7. UDP通信程序练习【应用】8. UDP三种通讯方式 1. TCP发送数据 Java中的TCP通信 Java对基于TCP协议的的网络提供了良好的封装&#xff0c;使…

chatgpt赋能python:Python删除文件目录

Python删除文件目录 Python是一种高级编程语言&#xff0c;广泛应用于开发各种类型的应用程序。Python的许多功能使其成为开发者的首选编程语言之一。在这篇文章中&#xff0c;我们将讨论如何使用Python删除文件和目录。 文件和目录的区别 在开始之前&#xff0c;让我们了解…

16_Linux内核启动流程

目录 链接脚本vmlinux.Ids Linux内核入口stext mmap_switched函数 start_kernel函数 rest_init函数 init进程 链接脚本vmlinux.Ids 要分析Linux启动流程,同样需要先编译一下Linux源码,因为有很多文件是需要编译才会生成的。首先分析Linux内核的连接脚本文件arch/arm/kem…

【Python】Python系列教程-- Python3 字符串(十一)

文章目录 前言Python3 字符串Python 访问字符串中的值Python 字符串更新Python 转义字符Python 字符串运算符Python 字符串格式化Python三引号f-stringUnicode 字符串Python 的字符串内建函数 前言 往期回顾&#xff1a; Python系列教程–Python3介绍&#xff08;一&#xff…

计算机网络-网络层1.0

传输单位 网络层将分组从源端传到目的端&#xff0c;为分组交换网上的不同主机提供通信服务&#xff0c;传输单位为数据报 路由器 完成路由选择和分组转发 路由选择&#xff1a;按照分布式算法&#xff0c;根据从相邻路由器所得到的的关于整个网络拓扑的变化情况&#xff0…

操作系统第二章​练习题

第一部分 教材习题&#xff08;P84&#xff09; 1、什么是前趋图&#xff1f;为什么要引入前趋图&#xff1f;​ 前趋图:是用于描述程序段或进程之间执行的先后顺序的有向无循环图。 引入的原因:为了更好的描述程序的顺序和并发执行的情况。 试画出下面4条语句的前趋图&#…