python数据分析——apply 2

devtools/2024/9/22 18:23:39/

参考资料:活用pandas

1、向量化函数

        使用apply时,可以按行或按列应用函数。如果想应用自定义的函数,必须重写它,因为整列或整行传递到了函数的第一个参数中。可以利用向量化函数和装饰器对所有函数进行向量化。对代码进行向量化也可以提升运行性能。

python"># 导入pandas库
import pandas as pd#创建一个DataFrame
df=pd.DataFrame({'a':[10,20,30],'b':[20,30,40]
})# 创建自定义函数
def avg_2(x,y):return (x+y)/2.

        对于向量函数,我们希望向上述自定函数中的x和y分别传入一个值向量,结果应该是给定x值和y值得平均值,并且顺序保持不变,即能写成avg_2(df['a'],df['b']),并且结果类似于[15,25,35]。

        使用numpy库的vetorize函数。把要向量化的函数传递给np.vectorize,创建新函数。

        如果函数是自定义的,也可以使用python装饰器“自动”把函数向量化。装饰器是函数,它们以其他函数为输入并修改其行为。

python"># 导入 numpy库
import numpy as np
# 自定义函数
# 此函数无法用于向量计算,但可以用于单个值的计算
def avg_2_mod(x,y):"""当x不等于20时,计算平均值"""if(x==20):return np.NaNelse:return (x+y)/2# np.vectorize创建向量化函数
avg_2_mod_vec=np.vectorize(avg_2_mod)
print(avg_2_mod_vec(df['a'],df['b']))# 装饰器
# 为了使用vectorize装饰器,要在函数定义之前使用@符号
@np.vectorize
def v_avg_2_mod(x,y):"""当x不等于20时,计算平均值和前面一样,但这里使用vectorize装饰器"""if x==20:return np.nanelse:return (x+y)/2
# 可以直接使用此向量化的函数
print(v_avg_2_mod(df['a'],df['b']))

2、lambda函数

        有时,apply方法中使用的函数非常简单,无须单独创建。

        编写lambda函数需要使用lambda关键字。由于apply函数会把整行或整列作为第一个参数传递过来,所以lambda函数只有一个参数x。然后可以直接编写函数,而不必定义它,而且结果结果会自动返回。

        虽然可以编写复杂的lambda函数,但通常只在需要单行计算时,才会使用lambda函数。如果lambda函数中包含过多代码,会难以阅读。

python">import re
docs=pd.read_csv(r"...\data\doctors.csv",header=None)
p=re.compile('\w+\s+\w+')# 方法1,先编写一个函数,在调用apply应用它
# 自定义函数
def get_name(s):return p.match(s).group()
docs['name_func']=docs[0].apply(get_name)
print(docs)# 方法2,直接用lambda函数
docs['name_lamb']=docs[0].apply(lambda x: p.match(x).group())
print(docs)


http://www.ppmy.cn/devtools/43279.html

相关文章

2023年广东省程序设计大赛

C 双指针&#xff0c;排序 买便宜的&#xff0c;用最贵的卖出 #include<bits/stdc.h>using namespace std; #define int long long const int N 2e5 10; int n,m; int re[2]{1,4}; int bl[4]{2,3,5,6}; int f; struct node {int x,y; }a[N]; bool cmp(node W,node Q…

TCP 连接排故:使用 BPF BCC工具包进行网络跟踪

写在前面 博文内容为 BCC 进行网络跟踪常见工具介绍tcpconnect:主动的 TCP 连接跟踪tcpaccept:被动的 TCP 连接跟踪tcpretrans:重传的 TCP 连接跟踪tcptracer:已建立的 TCP 连接跟踪tcpconnlat:测量出站 TCP 连接的延迟tcpdrop:被内核丢弃的 TCP 数据包跟踪tcplife: TCP 会话追…

单片机的内存映射和重映射

内存映射 在单片机内&#xff0c;不管是RAM还是ROM还是寄存器&#xff0c;他们都是真实存在的物理存储器&#xff0c;为了方便操作&#xff0c;单片机会给每一个存储单元分配地址&#xff0c;这就叫做内存映射。 单片机的内存映射是指将外部设备或外部存储器映射到单片…

数据赋能(101)——概念:数据治理、数据管理

此文为本人学习与提高能力的笔记。 数据治理与数据管理这两个术语&#xff0c;尽管在数据管理的领域中经常相伴出现&#xff0c;且在某些情境下可能被视为具有相似的语义范畴&#xff0c;但为了确保术语使用的精准度和专业性&#xff0c;我们必须对它们有更为深入的认知。我们…

【sass插值语句 #{}简介以及使用方法】

Sass 中的插值&#xff08;Interpolation&#xff09;是一种强大的特性&#xff0c;它允许你在 Sass 代码中嵌入变量、选择器、属性名或任何其他 Sass 表达式&#xff0c;并动态地生成 CSS 代码。插值通过 #{} 语法来实现。 Sass 插值简介 Sass 插值允许你创建可动态生成内容…

URI 和URL以及URN的区别

URI 和URL以及URN的区别 URL&#xff0c;URI&#xff0c;URN的关系 URN和URL都是URI中的一种 URI 统一资源标识符 URL 统一资源定位符 URN 统一资源名称 URL 统一资源标识符 用于表示某一互联网资源名称的字符串&#xff0c;该种标识允许用户对任何的资源通过特定的协议进…

C++基础——vector的详解与运用

vector的介绍 文档介绍 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;…

电路仿真软件:点亮教学新篇章,十大便利助力高效学习

在信息化时代的浪潮中&#xff0c;电路仿真软件以其独特的优势&#xff0c;逐渐在教学领域崭露头角。它不仅能够帮助学生更好地理解电路知识&#xff0c;还能提升教师的教学效果。接下来&#xff0c;让我们一起探讨电路仿真软件对教学带来的十大便利。 一、直观展示电路原理 电…