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

news2024/12/23 0:15:43

一 说明

        窗口函数是什么?窗口函数是时间序列的局部属性处理函数,比如,一维卷积滤波、移动平均、指数平均本篇我们将针对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/603689.html

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

相关文章

大语言模型速查表;ChatGPT发展路线图;11条市场营销ChatGPT Prompt;使用Midjourney制作专属头像 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 大语言模型速查表 Large Language Model Cheat Sheet ShowMeAI知识星球资源编码&#xff1a;R115 本份速查表的制作目的&#xff0c;是…

Linux4.2LAMP

文章目录 计算机系统5G云计算第一章 LINUX LAMP一、概述二、编译安装Apache httpd服务1.关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt目录下2.安装环境依赖包3.配置软件模块4.编译及安装5.优化配置文件路径&#xff0c;并把httpd服务的可执行程序文件放入路径环境变量…

LInux-文本处理相关命令笔记

目录 文本处理相关命令正则表达式介绍BRE和ERE seqxargs常用选项常用使用方法 uniq介绍常见选项常见使用方法实例 tr常用选项常见使用方法能转换的原因 grep常见选项grep -v 选项 -v和[^..]的区别 常见使用方法使用 总结 cut介绍使用 sort介绍语法参数 使用去重 排序原则按字典…

HarmoneyOS入门--下载与安装DevEco Studio运行helloworld

下载与安装DevEco Studio 在HarmonyOS应用开发学习之前&#xff0c;需要进行一些准备工作&#xff0c;首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 下载DevEco Studio 下载完成后&#xff0c;双击下载的“deveco-studio-xxxx.exe”&#xff0c;进入DevEco S…

chatgpt赋能python:Python创建空变量的方法

Python创建空变量的方法 Python是一种非常受欢迎的编程语言&#xff0c;因为它易于学习和使用&#xff0c;并且具有动态语言的特点。不管你是新手还是有经验的开发人员&#xff0c;你肯定会经常遇到需要创建空变量的情况。在这篇文章中&#xff0c;我们将探讨Python中创建空变…

AI对话交互场景使用WebSocket建立H5客户端和服务端的信息实时双向通信

WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c;并进行双向数据传输。 一、为什么需要 WebSock…

设计模式之~工厂系列(简单工厂、工厂方法、抽象工厂)

目录 简单工厂模式 工厂方法模式 简单工厂 VS 工厂方法 抽象工厂模式&#xff1a; 拓展&#xff1a; 利用简单工厂模式优化抽象工厂 利用反射抽象工厂 进行优化 反射配置文件抽象工厂进行优化 简单工厂模式 优点&#xff1a;简单工厂模式的最大优点在于工厂类包含…

Arthas-JVM相关命令使用

tip&#xff1a;作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 开头&#xff1a; 我们先说下生产使用频率较高的有哪些&#xff1a;dashboard、heapdump、jvm…

【mqtt】MQTT安装与入门案例

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍MQTT的c版本入门。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习知识&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&…

java高频面试题

集合 前言 时间复杂度 时间复杂度是用来来评估代码的执行耗时的&#xff0c;大O表示法&#xff1a;不具体表示代码的真正执行时间&#xff0c;而是表示代码执行时间随数据规模增长的变化趋势。 当n很大时&#xff0c;低阶、常量、系数并不能影响其增长趋势&#xff0c;因此可以…

压缩感知重构之广义正交匹配追踪法

算法的重构是压缩感知中重要的一步&#xff0c;是压缩感知的关键之处。因为重构算法关系着信号能否精确重建&#xff0c;国内外的研究学者致力于压缩感知的信号重建&#xff0c;并且取得了很大的进展&#xff0c;提出了很多的重构算法&#xff0c;每种算法都各有自己的优缺点&a…

RFID在工业自动化产线工艺中的应用

RFID在工业自动化产线工艺中的应用 随着工业自动化技术的不断发展&#xff0c;RFID&#xff08;Radio Frequency Identification&#xff09;技术在自动化产线数据采集方面得到了广泛应用。RFID技术是一种通过电磁波进行无线通信和识别的技术&#xff0c;它可以对物品进行追踪…

电子器件系列39:反激式变压器

反激式(Flyback)变压器又称单端反激式或Buck-Boost转换器。因其输出端在原边绕组断开电源时获得能量故而得名。反激式变换器以其电路结构简单&#xff0c;成本低廉而深受广大开发工程师的喜爱。 反激式变压器适合小功率电源以及各种电源适配器。但是反激式变换器的设计难点是变…

Oracle中的数据导出(1)

目录 1、基本语法&#xff1a; 2、操作步骤 3、spool作用 SPOOL命令的使用 在 Oracle 中&#xff0c;SPOOL 是一条 SQLPLUS 命令&#xff0c;用于将执行 SQL 脚本的输出结果保存到指定文件中。SPOOL 命令可以帮助用户快速导出查询结果、生成报表等常见任务。 1、基本语法&…

压缩感知重构算法之正交匹配追踪算法(OMP)

算法的重构是压缩感知中重要的一步&#xff0c;是压缩感知的关键之处。因为重构算法关系着信号能否精确重建&#xff0c;国内外的研究学者致力于压缩感知的信号重建&#xff0c;并且取得了很大的进展&#xff0c;提出了很多的重构算法&#xff0c;每种算法都各有自己的优缺点&a…

java-面向对象

java-面向对象 面向对象 首先考虑事物中存在哪些对象&#xff0c;再建立对象与对象的关系 一、面向对象-&#xff08;类和对象&#xff09; 1.1类和对象的理解 客观存在的事物皆为对象 &#xff0c;所以我们也常常说万物皆对象。 类 类的理解 类是对现实生活中一类具有共同属性…

java-字符流和字节流(一)

java-字符流和字节流(一) 一、File类 1.1 File类概述和构造方法 File类介绍 它是文件和目录路径名的抽象表示文件和目录是可以通过File封装成对象的对于File而言&#xff0c;其封装的并不是一个真正存在的文件&#xff0c;仅仅是一个路径名而已。它可以是存在的&#xff0c;也…

【C++ 程序设计】第 1 章:C++ 语言简介

目录 一、C 语言的发展简史 二、C 语言的特点 &#xff08;1&#xff09;基本的输入/输出 &#xff08;2&#xff09;头文件和命名空间 &#xff08;3&#xff09;强制类型转换运算符 &#xff08;4&#xff09;函数参数的默认值 &#xff08;5&#xff09;引用和函数…

超简单好看的HTML5七夕情人节表白网页(表白直接拿去用) HTML+CSS+JS

博主&#xff1a;命运之光 专栏&#xff1a;web开发&#xff08;html css js&#xff09; 目录 ✨简介&#xff1a; ✨前言&#xff1a; ✨视频展示 ✨源代码 ✨代码的使用方法&#xff08;超简单什么都不用下载&#xff09; &#x1f353;1.打开记事本 &#x1f353;2.将…

springboot+vue高校食堂点餐送餐配送系统

食堂送餐系统的开发过程中&#xff0c;采用B / S架构&#xff0c;主要使用java语言进行开发&#xff0c;结合最新流行的springboot框架。使用Mysql数据库和Eclipse/idea开发工具。该四川工商学院食堂送餐系统包括用户、商家、送餐员和管理员。其主要功能包括商家管理、用户管理…