3.Pandas高级函数应用

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# plt.style.use("bmh")
plt.rc('font', family='SimHei', size=13)
%matplotlib inlineimport warnings
warnings.filterwarnings('ignore')pd.__version__
'2.1.1'

1.1 函数应用

1.1.1 apply

apply()作为一种可自定义的函数,可以对series和dataframe的行列进行自定义函数操作并返回结果。对于分组、窗口、重采样下的dataframe子集等场景也同样适用,是复杂逻辑实现的一个非常强力的方法。
需要注意的是,apply()在对series和dataframe的用法上有所差别:

  • series:apply操作的对象是series的每个元素,不可设置行列轴方向;
  • dataframe:apply操作的对象是dataframe中的每一列或者每一行,可以设置行列方向。
# 定义数据集
df_english=pd.DataFrame({"student": ["John", "James", "Jennifer"],"gender": ["male", "male", "female"],"score": [20, 30, 30],"subject": "english"})df_math=pd.DataFrame({"student": ["John", "James", "Jennifer"],"gender": ["male", "male", "female"],"score": [90, 100, 95],"subject": "math"})
df = pd.concat([df_english, df_math],ignore_index=True)
df = df.sort_values(['student','subject']).reset_index(drop=True)
df
studentgenderscoresubject
0Jamesmale30english
1Jamesmale100math
2Jenniferfemale30english
3Jenniferfemale95math
4Johnmale20english
5Johnmale90math
Series
df['score'].apply(lambda x:x-3 if x>90 else x)
0    30
1    97
2    30
3    92
4    20
5    90
Name: score, dtype: int64
DataFrame
# axis=0 -->>对列操作
def col(x):if x.name=='score':return x+5else:return xdf = df.apply(col, axis=0)
df
studentgenderscoresubject
0Jamesmale35english
1Jamesmale105math
2Jenniferfemale35english
3Jenniferfemale100math
4Johnmale25english
5Johnmale95math
# axis=1 -->>对行操作
def row(x):if x['subject']=='english':para=1.1else:para=1.2return x['score']*paradf['new_score'] = df.apply(row, axis=1,result_type='expand')
df
studentgenderscoresubjectnew_score
0Jamesmale35english38.5
1Jamesmale105math126.0
2Jenniferfemale35english38.5
3Jenniferfemale100math120.0
4Johnmale25english27.5
5Johnmale95math114.0
传入参数

函数参数需要在args参数中设置,以元组方式args=(x1, x2, ...)完成。

# args参数
def score_bias(x, bias):if x > 90:return x+biaselse:return xdf["score"] = df["score"].apply(score_bias, args=(-3,))     # bias是形参,-3是实参
df
studentgenderscoresubjectnew_score
0Jamesmale35english38.5
1Jamesmale102math126.0
2Jenniferfemale35english38.5
3Jenniferfemale97math120.0
4Johnmale25english27.5
5Johnmale92math114.0
传入关键字

传入关键字english=0math=1。函数内通过kwargs['english']=0kwargs['math']=1

# 传入关键字
def subject_map(x, **kwargs):return kwargs[x]df["subject_no"] = df["subject"].apply(subject_map, english=0, math=1)
df
studentgenderscoresubjectnew_scoresubject_no
0Jamesmale35english38.50
1Jamesmale102math126.01
2Jenniferfemale35english38.50
3Jenniferfemale97math120.01
4Johnmale25english27.50
5Johnmale92math114.01

1.1.2 applymap

applymap()应用于dataframe时(且只能用于dataframe),操作对象是每个元素,即接收一个标量元素经过函数处理后再返回一个标量函数,是点对点的操作。

def el_cook(x):if isinstance(x,str):return 's_'+xelse:return str(x)
df.applymap(el_cook)
studentgenderscoresubjectnew_scoresubject_no
0s_Jamess_male35s_english38.50
1s_Jamess_male102s_math126.01
2s_Jennifers_female35s_english38.50
3s_Jennifers_female97s_math120.01
4s_Johns_male25s_english27.5000000000000040
5s_Johns_male92s_math114.01

1.1.3 map

map()只能应用于series,可以将series元素通过字典或函数进行映射操作。

  • arg: 映射参数,可以是映射子类如字典、函数或series;
  • na_action:对na空值的处理;
    • None:默认传给函数处理;
    • ignore:忽略并直接传播空值,而不传给函数处理。
字典映射
GENDER_ENCODING= {"male": 0,"female": 1}
df['gender_map'] = df["gender"].map(GENDER_ENCODING)
df
studentgenderscoresubjectnew_scoresubject_nogender_map
0Jamesmale35english38.500
1Jamesmale102math126.010
2Jenniferfemale35english38.501
3Jenniferfemale97math120.011
4Johnmale25english27.500
5Johnmale92math114.010
函数映射

缺点是不能像apply()一样传入参数和关键字。大数据时映射效率更高。

df['score'].map(np.sqrt).to_frame()
score
05.916080
110.099505
25.916080
39.848858
45.000000
59.591663
df['student'].map(list).to_frame()
student
0[J, a, m, e, s]
1[J, a, m, e, s]
2[J, e, n, n, i, f, e, r]
3[J, e, n, n, i, f, e, r]
4[J, o, h, n]
5[J, o, h, n]
# 自定义函数
df['score'].map(lambda x:x-3 if x>90 else x)
0    35
1    99
2    35
3    94
4    25
5    89
Name: score, dtype: int64

1.1.4 transform

transform()是一种转换函数,其特点是返回结果与自身的形状相同,即前后的shape形状保持不变。因此,transform()的返回结果与自身形状相同,所以不支持有降维功能的函数,比如聚合函数minmeanstd

# 生成测试数据
cols = ["C_0", "C_1", "C_2", "C_3"]
np.random.seed=123
df = pd.DataFrame(np.random.randint(1, 5, size = (5,4)), columns=cols)
df
C_0C_1C_2C_3
03333
14231
21114
33212
44122
单个函数

传入的单个函数可以是库函数、自定义函数或匿名函数。

df.transform(np.exp).transform(lambda x:round(x,2))
C_0C_1C_2C_3
020.0920.0920.0920.09
154.607.3920.092.72
22.722.722.7254.60
320.097.392.727.39
454.602.727.397.39
多个函数

transform()传入多个函数是列表形式时,会对dataframe所有列依次进行各函数的转换操作。注意如果有名字相同的函数,只有最后一个函数生效,这个不同于agg()函数可以使得多个匿名函数同时生效。

df.transform([np.square, np.sqrt]).transform(lambda x:round(x,2))
C_0C_1C_2C_3
squaresqrtsquaresqrtsquaresqrtsquaresqrt
091.7391.7391.7391.73
1162.0041.4191.7311.00
211.0011.0011.00162.00
391.7341.4111.0041.41
4162.0011.0041.4141.41

1.1.5 pipe

前面的applymap()是元素级、apply()transform()是行列级应用的函数,pipe()则是表格级的应用函数,称为管道函数。

单个函数
df.pipe(np.exp).pipe(lambda x: round(x, 2))
C_0C_1C_2C_3
020.0920.0920.0920.09
154.607.3920.092.72
22.722.722.7254.60
320.097.392.727.39
454.602.727.397.39
链式调用
df.pipe(np.square).\pipe(np.multiply, 1.5).\pipe(np.add, 8)
C_0C_1C_2C_3
021.521.521.521.5
132.014.021.59.5
29.59.59.532.0
321.514.09.514.0
432.09.514.014.0
特殊传参方式

pipe()默认情况下会将dataframe传给调用函数的第一个参数,但一些函数的第一个参数并不是用来接收dataframe输入数据的,如果直接将函数传到pipe()中会提示报错。
为了解决这个问题,pipe()中规定了一种特殊的参数传递方法,是**元组(callable, data_keyword)**的形式。

  • callable:指定pipe()中调用的函数;
  • data_keyword:指定将dataframe传给函数中的哪一个参数。
def spcl(num, df):return df.add(num)
df.pipe((spcl,'df'), 2)
C_0C_1C_2C_3
05555
16453
23336
35434
46344

1.2 表达式求值

1.2.1 eval

eval()是一个神奇的函数,可以通过字符串表达式的方式对series和dataframe进行计算和解析操作。其有两大优势:

  1. 对数据较大的dataframe对象操作更高效;
  2. 对复杂的算术和布尔运算更快速,因为后端计算引擎默认是numexpr

eval()支持以下算术操作:

  1. 算术运算:除左移<<和右移>>运算符外的算术运算
  2. 比较操作:包括链式比较,比如,2 < df < df2
  3. 布尔运算:例如,df < df2 and df3 < df4 or not df_bool
  4. 列表和元组:如[1, 2],(1, 2)
  5. 属性访问,如df.a
  6. 下标表达式:如df[0]
  7. 变量评估:如pd.eval('df')
  8. 数学函数:如sincos

eval()不允许使用Python语法:

  • 表达式
    • 数学函数以外的函数调用
    • is is not操作
    • if表达式
    • lambda表达式
    • list/set/dict comprehension
    • literal的dictset表达式
    • yield表达
    • 生成器表达式
    • 仅包含标量值的布尔表达式
  • 声明
    • for, while, if

eval()有两种函数形式

  1. pandas.eval()
  2. dataframe.eval(),是前者的高级封装。
单列变量
pd.eval("C_4 = (df.C_0 > 1) & (df.C_2 == 4)", target=df)
C_0C_1C_2C_3C_4
03333False
14231False
21114False
33212False
44122False
df.eval("C_4 = (C_0 > 1) & (C_2 == 4)")            # 与上面等价
C_0C_1C_2C_3C_4
03333False
14231False
21114False
33212False
44122False
多列变量
df.eval("""C_4 = C_0 + C_1C_5 = C_1 + C_2C_6 = C_2 + C_3"""
)
C_0C_1C_2C_3C_4C_5C_6
03333666
14231654
21114225
33212533
44122534
局部变量

字符串表达式中可加入局部变量参与计算,通过@前缀标识完成,该前缀方法只能应用于dataframe.eval()函数,对pd.eval()不生效。

a = 5
b = 2
df.eval("C_4 = C_0 * @a + @b")
C_0C_1C_2C_3C_4
0333317
1423122
211147
3321217
4412222
a = 5
b = 2
pd.eval("C_4 = df.C_0 * a + b", target=df)
C_0C_1C_2C_3C_4
0333317
1423122
211147
3321217
4412222
类型解析

这里的eval()是Python的内置方法,用来解析字符串。

# 字符类型
a = '[1,2,3]'
type(a) 
str
b=eval(a)
type(b)
list

1.2.2 query

dataframe.query()dataframe.eval()一样,也是pd.eval()的高级封装,可对dataframe对象进行查询操作。

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

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

相关文章

【算法Hot100系列】两数相加

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

如何用ChatGPT分析恶意软件?

自从我们进入数字化时代以来&#xff0c;恶意软件就一直是计算机应用系统的“心腹大患”。事实上&#xff0c;每一次技术进步都会为恶意行为者提供更多的工具&#xff0c;使得他们的攻击行为更具破坏性。不过&#xff0c;如今生成式人工智能的崛起&#xff0c;似乎让一直以来的…

2023年【G3锅炉水处理】找解析及G3锅炉水处理模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 G3锅炉水处理找解析根据新G3锅炉水处理考试大纲要求&#xff0c;安全生产模拟考试一点通将G3锅炉水处理模拟考试试题进行汇编&#xff0c;组成一套G3锅炉水处理全真模拟考试试题&#xff0c;学员可通过G3锅炉水处理模…

【网络】简单聊一下 TIME_WAIT

问题背景 笔者在看自己服务状态数据的时候&#xff0c;会发现有很多 tcp 的连接&#xff0c;也会发现有很多处于不同状态下的 tcp 连接&#xff0c;TIME_WAIT 的连接数有83个&#xff0c;为了弄清楚这个 TIME_WAIT 是什么&#xff0c;整理了下面的笔记用于梳理概念 基础流程…

rocketmq window测试小Demo 解决找不到或无法加载主类的问题

文章目录 rocketMQ启动1.下在相关的二进制文件2.配置环境变量3.启动NameServer4.启动broker5. MQ 启动&#xff01;5.1 测试发送数据 6.关闭服务 rocketMQ启动 1.下在相关的二进制文件 下载地址&#xff0c;点击即达 2.配置环境变量 3.启动NameServer 在文件夹下执行cmd进…

vue项目 实现 vue-schart 图表 resize

项目中之前用了 vue-schart&#xff08;项目已经没人维护&#xff0c;很久不更新了&#xff09; GitHub - lin-xin/vue-schart: :bar_chart: Vue.js wrapper for sChart.js 没有resize功能&#xff0c;又不想修改源码&#xff0c;可以参考下边的方法实现&#xff1a; <tem…

Redis7--基础篇9(SpringBoot集成Redis)

1. jedis、lettuce、Redistemplate的关系 第一代为jedis&#xff0c;之后推出了lettuce&#xff0c;然后springboot继承了Redistemplate&#xff0c;现推荐使用Redistemplate。 总的来说&#xff0c;jedis、lettuce、Redistemplate都是java操作Redis数据库的驱动。 2. 本地Ja…

【精选小tips】Microsoft Edge最新版本关闭侧边栏快捷键

相信有很多小伙伴并不习惯使用Edge浏览器的侧边栏功能&#xff0c;感觉有点突兀&#xff0c;平时使用率又不是很高&#xff0c;想要将其关闭&#xff0c;但是&#xff01;&#xff01;&#xff01;Edge浏览器自动更新到120.0.2210.61版本后&#xff0c;居然在设置中之间没有了关…

深度学习(六):paddleOCR理解及识别手写体,手写公式,表格

1.介绍 1.1 什么是OCR? 光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;ORC是指对包含文本资料的图像文件进行分析识别处理&#xff0c;获取文字及版面信息的技术&#xff0c;检测图像中的文本资料&#xff0c;并且识别出文本的内容。…

传谷歌拟在广告中使用新AI模型,并为YouTuber提供建议

原标题&#xff1a;传谷歌(GOOG.US)拟在广告中使用新AI模型 并为YouTuber提供建议 智通财经 APP 获悉&#xff0c;据报道&#xff0c;谷歌正努力将新的人工智能技术迅速融入其核心产品&#xff0c;且这一努力正在进入广告领域。据内部文件显示&#xff0c;该公司已经批准了在大…

一键删除TXT文本符号,高效批量处理,轻松提升工作效率!

你是否经常处理大量的TXT文本文件&#xff0c;但其中充满了各种符号和不需要的字符&#xff1f;这不仅影响文本的阅读体验&#xff0c;还可能对后续的数据处理和分析造成困扰。现在&#xff0c;我们为你带来一款全新的TXT文本处理工具&#xff0c;一键删除符号&#xff0c;高效…

【数据结构—栈的实现(数组栈)】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、栈 1.1栈的概念及结构 二、栈的实现 2.1头文件的实现—Stack.h 2.2源文件的实现—Stack.c 2.3源文件的测试—test.c 三、栈的实际测试数据展示 3.1正常的出…

【图像分类】【深度学习】【Pytorch版本】 DenseNet模型算法详解

【图像分类】【深度学习】【Pytorch版本】 DenseNet模型算法详解 文章目录 【图像分类】【深度学习】【Pytorch版本】 DenseNet模型算法详解前言DenseNet讲解Dense Block(稠密块)Dense Layer(稠密层)Transition Layer 过渡层DenseNet模型结构 DenseNet Pytorch代码完整代码附加…

鱼fish数据集VOC+yolo-1400张(labelImg标注)

鱼类&#xff0c;是最古老的脊椎动物。易蓄积重金属。 部分不同染色体数目的杂交的后代依然有生育能力。它们几乎栖居于地球上所有的水生环境&#xff0c;从淡水的湖泊、河流到咸水的大海和大洋。 今天要介绍鱼的数据集。 数据集名称&#xff1a;鱼 fish 数据集格式&#xf…

五分钟快速掌握Maven的核心概念

前两天在一个技术群&#xff0c;有人还在问maven中groupId、artifactId、version这些关键字的含义是什么&#xff0c;于是&#xff0c;我觉得还是很有必要来聊聊Maven中的这些核心概念。 成功不是将来才有的&#xff0c;而是从决定去做的那一刻起&#xff0c;持续累积而成。 …

有基础转Go语言学习笔记(3. 面向对象篇)

有基础转Go语言学习笔记&#xff08;3. 面向对象篇&#xff09; 封装 在Go语言中&#xff0c;封装是通过使用结构体&#xff08;structs&#xff09;和方法&#xff08;methods&#xff09;来实现的。Go语言的封装不同于传统面向对象编程语言中的类&#xff08;class&#xf…

一次持续 15 年的网络安全“攻防之战”

2003 年 7-8 月&#xff0c;冲击波病毒爆发&#xff0c;对网络安全造成严重影响&#xff0c;尤其是校园网。冲击波病毒不仅使得校园网变得卡顿&#xff0c;还会在学生电脑上强制弹出一个倒计时窗口&#xff0c;60 秒后自动关机&#xff0c;给学生正常使用电脑和网络造成了极大不…

JS之递归

递归是什么&#xff1f; 调用自身函数称为递归函数 function fn(){fn()}fn()递归的作用和循环是基本一样的 编写递归函数&#xff0c;一定要包含两个条件 1.基线条件 2.递归条件 接下来我用几个实例为大家带来递归的用法 1.使用递归让延迟器有定时器的效果 function timer() …

Visual Studio Code (Vscode)配置LaTeX

Visual Studio Code (Vscode)配置LaTeX 实操记录 第一步高效检索&#xff0c;找到官方的、靠谱的安装教程&#xff0c;最好多找几个&#xff0c;英文、中文教程都需要 LaTeX WorkshopInstallation and basic settingsHow to install LaTeX (with previews & autocomplete…

Godot导出Android包报错:无效的包名称

问题描述 使用Godot为项目导出Android平台包时报错&#xff0c;提示&#xff1a;“无效的包名称&#xff1a;项目名称不符合包名格式的要求。请显式指定包名。” 解决办法 修改导出配置项“包->唯一名称”。 该项缺省值“org.godotengine.$genname”不能直接使用&#x…