当前位置: 首页 > news >正文

Pandas-apply自定义函数

文章目录

  • 一. Series的apply方法
    • 1. 一个元素一个元素的传入
    • 2. apply传入一个参数函数
    • 2.apply传入多个参数函数
  • 二. DataFrame的apply方法
    • 1. axis参数指定按行/ 按列(默认)传入数据
    • 2. apply使用
  • 三. apply 使用案例
    • 1. 栗子1
    • 2. 栗子2-列
    • 3. 栗子3-行
  • 四. 向量化函数
    • 1. 使用np.vectorize将函数向量化
    • 2. 使用装饰器将函数向量化
  • 五. lambda函数

简介

Pandas提供了很多数据处理的API,但当提供的API不能满足需求的时候,需要自己编写数据处理函数, 这个时候可以使用apply函数
apply函数可以接收一个自定义函数, 可以将DataFrame的行/列数据传递给自定义函数处理
apply函数类似于编写一个for循环, 遍历行/列的每一个元素,但比使用for循环效率高很多

一. Series的apply方法

1. 一个元素一个元素的传入

def my_print(x):print('****************')print(x)print(type(x))return xdf['a'].apply(my_print)

在这里插入图片描述

2. apply传入一个参数函数

准备数据

import pandas as pd
df = pd.DataFrame({'a':[10,20,30],'b':[40,50,60]})
df

在这里插入图片描述

创建一个自定义函数

def my_sq(x):'''求平方'''return x**2

apply方法有一个func参数, 把传入的函数应用于Series的每个元素

df['a'].apply(my_sq)

在这里插入图片描述

注意,把my_sq传递给apply的时候,不要加上圆括号

2.apply传入多个参数函数

def my_exp(x,e):return x**e
df['a'].apply(my_exp,e=3)

在这里插入图片描述

二. DataFrame的apply方法

1. axis参数指定按行/ 按列(默认)传入数据

def my_func(x):print(x)print('x的数据类型是',type(x))return xdf.apply(my_func)

在这里插入图片描述

def my_func(x):print(x)print('x的数据类型是',type(x))return xdf.apply(my_func,axis = 1)

在这里插入图片描述

2. apply使用

把上面创建的my_exp, 直接应用到整个DataFrame中

df.apply(my_exp,e=2)

在这里插入图片描述

def avg_3(col):x = col[0]y = col[1]z = col[2]return (x+y+z)/3df.apply(avg_3)

在这里插入图片描述

def avg_2(row):x = row[0]y = row[1]return (x+y)/2df.apply(avg_2, axis=1)

在这里插入图片描述

三. apply 使用案例

使用titanic数据集来介绍apply的用法

加载数据

titanic = pd.read_csv('data/titanic_train.csv')
titanic.head()

在这里插入图片描述

titanic.info()

在这里插入图片描述
该数据集有891行,12列, 其中age 和 Cabin,Embarked三列中包含缺失值

1. 栗子1

import numpy as np#可以使用apply计算数据中有多少null 或 NaN值
def count_missing(vec):#计算一列中缺失值的个数#根据值是否确实获取一个由True和False组成的向量null_vec = pd.isnull(vec)#print(null_vec)null_count = np.sum(null_vec)return null_count#缺失值占比
def prop_missing(vec):# 计算一列中缺失值的占比# 计算缺失值的个数#这里使用count_missing()num = count_missing(vec)  #获得向量中元素的个数#也需要统计缺失值个数dem = vec.sizereturn num/dem# 非缺失值占比
def prop_complete(vec):#计算一列非缺失值(完整值)占比#先计算缺失值比例#再计算非缺失值比例return 1-prop_missing(vec)

把前面定义好的函数应用于数据的各列

titanic.apply(count_missing)

在这里插入图片描述

titanic.apply(prop_missing)

在这里插入图片描述

titanic.apply(prop_complete)

在这里插入图片描述
把前面定义好的函数应用于数据的各行

titanic.apply(count_missing ,axis = 1)

在这里插入图片描述

titanic.apply(prop_missing ,axis = 1)

在这里插入图片描述

titanic.apply(prop_complete ,axis = 1)

在这里插入图片描述

titanic.apply(count_missing, axis=1).value_counts()

在这里插入图片描述

2. 栗子2-列

def cut_age(age):if age<18:return '未成年'elif 18<=age<40:return '青年'elif 40<=age<60:return '中年'elif 60<=age<81:return '老年'else:return '未知'
titanic['Age'].apply(cut_age).value_counts()

在这里插入图片描述

#筛选出年龄大于60的数据
titanic[titanic['Age']>=60]

3. 栗子3-行

# Pclass = 1 并且 Name中 包含了Master/Dr/Sir
def get_vip(x):if x['Pclass'] ==1 and ('Master' in x['Name'] or 'Dr' in x['Name'] or 'Sir' in x['Name'] ):return 'VIP'else:return 'Normal'
titanic['vip'] = titanic.apply(get_vip,axis=1)
titanic['vip'].value_counts()

在这里插入图片描述

# 筛选出vip客户
titanic[titanic['vip']=='VIP']

在这里插入图片描述

四. 向量化函数

创建一个DataFrame

df = pd.DataFrame({'a':[10,20,30],'b':[20,30,40]})

在这里插入图片描述
创建函数

def avg_2(x,y):return (x+y)/2
avg_2(df['a'],df['b'])

在这里插入图片描述
修改函数

def avg_2_mod(x,y):if x==20:return np.nanreturn (x+y)/2
avg_2(df['a'],df['b'])

在这里插入图片描述

在这里插入图片描述

1. 使用np.vectorize将函数向量化

avg_2_mod_vec = np.vectorize(avg_2_mod)
avg_2_mod_vec(df['a'], df['b'])

在这里插入图片描述

2. 使用装饰器将函数向量化

@np.vectorize
def avg_2_mod(x,y):if x==20:return np.nanreturn (x+y)/2
avg_2_mod(df['a'],df['b'])

在这里插入图片描述

五. lambda函数

当函数比较简单的时候, 没有必要创建一个def 一个函数, 可以使用lambda表达式创建匿名函数

df.apply(lambda x: x+1)

在这里插入图片描述

http://www.lryc.cn/news/513068.html

相关文章:

  • github 项目分享
  • 与你共度的烟火日常
  • 基于Python的社交音乐分享平台
  • Kafka的acks机制和ISR列表
  • FreeRTOS: ISR(中断服务例程)和 TCB(任务控制块)
  • 【Spring】Spring DI(依赖注入)详解—自动装配—byType实现原理
  • 015-spring-动态原理、AOP的xml和注解方式
  • linux更换yum源
  • 跨年战揭开本地生活新赛季:美团、抖音和快手争夺冰雪经济
  • 文件传输工具FTransferor<优化篇>
  • 【最新】17个一站式数据集成平台案例PPT下载(Apache SeaTunnel )
  • 【每日学点鸿蒙知识】子窗口方向、RichEdit不居中、本地资源缓存给web、Json转对象丢失方法、监听状态变量数组中内容改变
  • 【AI绘画】Midjourney前置指令/imagine与单图指令详解
  • 【鸿蒙NEXT】鸿蒙里面类似iOS的Keychain——关键资产(@ohos.security.asset)实现设备唯一标识
  • 学习笔记 --C#基础其他知识点(数据结构)
  • AI与药学 | ChatGPT 在临床药学中的有效性以及人工智能在药物治疗管理中的作用
  • Streamlining QA with Automated Testing for 3D Models
  • 产品原型设计
  • 【Linux命令】su、sudo、sudo su、sudo -i、sudo -l的用法和区别
  • 【广州计算机学会、广州互联网协会联合主办 | ACM独立出版 | 高录用】第四届大数据、信息与计算机网络国际学术会议(BDICN 2025)
  • HTML5 开关(Toggle Switch)详细讲解
  • win32汇编环境下,双击窗口程序内生成的listview列表控件的某行,并提取其内容的示例程序
  • mysql主从断开后问题排查及修复
  • [2025] 如何在 Windows 计算机上轻松越狱 IOS 设备
  • 计算机网络—————考研复试
  • [pdf、epub]260道《软件方法》强化自测题业务建模需求分析共216页(202412更新)
  • LeetCode - 初级算法 数组(只出现一次的数字)
  • Android性能优化概述
  • C++ 实现map容器从大到小排序
  • java中的文件操作