Pandas中高效选择和替换操作总结

Pandas是数据操作、分析和可视化的重要工具,有效地使用Pandas可能具有挑战性,从使用向量化操作到利用内置函数,这些最佳实践可以帮助数据科学家使用Pandas快速准确地分析和可视化数据。

图片

在本文中,我们将重点介绍在DataFrame上经常执行的两个最常见的任务,特别是在数据科学项目的数据操作阶段。这两项任务是有效地选择特定的和随机的行和列,以及使用replace()函数使用列表和字典替换一个或多个值。

在本文中,我们将使用下面的数据集:

扑克牌游戏数据集

婴儿名字数据集

我们使用的第一个数据集是扑克牌游戏数据集,如下所示。

poker_data = pd.read_csv(‘poker_hand.csv’)
poker_data.head()
图片

在每个回合中,每个玩家手里有五张牌,每一张牌都有花色:红心、方块、梅花或黑桃,以及它的数字,范围从1到13。该数据集由一个人可以拥有的五张卡片的每一种可能组合组成。

Sn:第n张牌的符号,其中:1(红心),2(方块),3(梅花),4(黑桃)

Rn:第n张牌的排名,其中:1(王牌),2-10,11(J),12(Q),13(K)

第二个数据集是流行的婴儿名字数据集,其中包括2011年至2016年间最流行的新生儿名字:

names = pd.read_csv(‘Popular_Baby_Names.csv’)
names.head()
图片

该数据集还包括按年份、性别和种族划分的美国最受欢迎的名字。例如,2011年,Chloe 这个名字在所有亚裔和太平洋岛民女性新生儿中排名第二。

下面我们开始进入正题

为什么需要高效的代码?
高效代码是指执行速度更快、计算容量更低的代码。在本文中,我们将使用time()函数来测量计算时间,我们通过在执行前和执行后获取时间,然后计算其差值获得代码的执行时间。下面是一个简单的例子:

import time

record time before execution

start_time = time.time()

execute operation

result = 5 + 2

record time after execution

end_time = time.time()
print(“Result calculated in {} sec”.format(end_time - start_time))
让我们看一个提高代码运行时间并降低计算时间复杂度的示例:我们将计算每个数字的平方,从0到100万。首先,我们将使用列表推导式来执行此操作,然后使用for循环重复相同的过程。

首先使用列表推导式:

#using List comprehension

list_comp_start_time = time.time()
result = [i*i for i in range(0,1000000)]
list_comp_end_time = time.time()
print(“Time using the list_comprehension: {} sec”.format(list_comp_end_time -
list_comp_start_time))
图片

使用for循环来执行相同的操作:

Using For loop

for_loop_start_time= time.time()
result=[]
for i in range(0,1000000):
result.append(i*i)
for_loop_end_time= time.time()
print(“Time using the for loop: {} sec”.format(for_loop_end_time - for_loop_start_time))
图片

可以看到它们之间有很大的差异,我们可以用百分比来计算它们之间的差异:

list_comp_time = list_comp_end_time - list_comp_start_time
for_loop_time = for_loop_end_time - for_loop_start_time
print(“Difference in time: {} %”.format((for_loop_time - list_comp_time)/
list_comp_time*100))
图片

可以看到仅仅使用了不同的方法,但是在执行效率方面有了很大的不同。

使用.iloc[]和.loc[]选择行和列
这里我们将介绍如何使用.iloc[] & .loc[] pandas函数从数据中高效地定位和选择行。我们将使用iloc[]作为索引号定位器,使用loc[]作为索引名定位器。

在下面的例子中,我们选择扑克数据集的前500行。首先使用.loc[]函数,然后使用.iloc[]函数。

rows = range(0, 500)

Time selecting rows using .loc[]

loc_start_time = time.time()
poker_data.loc[rows]
loc_end_time = time.time()
print(“Time using .loc[] : {} sec”.format(loc_end_time - loc_start_time))
图片

rows = range(0, 500)

Time selecting rows using .iloc[]

iloc_start_time = time.time()
poker_data.iloc[rows]
iloc_end_time = time.time()
print(“Time using .iloc[]: {} sec”.format(iloc_end_time - iloc_start_time))
图片

loc_comp_time = loc_end_time - loc_start_time
iloc_comp_time = iloc_end_time - iloc_start_time
print(“Difference in time: {} %”.format((loc_comp_time - iloc_comp_time)/
iloc_comp_time*100))
图片

虽然这两个方法使用的方式是相同的,但iloc[]的执行速度比loc[]快近70%。这是因为.iloc[]函数利用了索引的顺序,索引已经排序因此速度更快。

我们还可以使用它们来选择列,而不仅仅是行。在下一个示例中,我们将使用这两种方法选择前三列。

iloc_start_time = time.time()
poker_data.iloc[:,:3]
iloc_end_time = time.time()
print(“Time using .iloc[]: {} sec”.format(iloc_end_time - iloc_start_time))
图片

names_start_time = time.time()
poker_data[[‘S1’, ‘R1’, ‘S2’]]
names_end_time = time.time()
print(“Time using selection by name: {} sec”.format(names_end_time - names_start_time))
图片

loc_comp_time = names_end_time - names_start_time
iloc_comp_time = iloc_end_time - iloc_start_time
print(“Difference in time: {} %”.format((loc_comp_time - iloc_comp_time)/
loc_comp_time*100))
图片

可以看到,使用.iloc[]进行列索引仍然要快80%。所以最好使用.iloc[],因为它更快,除非使用loc[]更容易按名称选择某些列。

替换DF中的值
替换DataFrame中的值是一项非常重要的任务,特别是在数据清理阶段。

让我们来看看之前加载的婴儿名字数据集:

图片

首先看看性别列:

names[‘Gender’].unique()
图片

我们可以看到,女性用大写和小写两个值表示。这在实际数据中非常常见,但是对于我们来说只需要一个统一的表示就可以了,所以我们需要将其中一个值替换为另一个值。这里有两种方法,第一种是简单地定义我们想要替换的值,然后我们想用什么替换它们。如下面的代码所示:

start_time = time.time()
names[‘Gender’].loc[names.Gender==‘female’] = ‘FEMALE’
end_time = time.time()

pandas_time = end_time - start_time
print(“Replace values using .loc[]: {} sec”.format(pandas_time))
图片

第二种方法是使用panda的内置函数.replace(),如下所示:

start_time = time.time()
names[‘Gender’].replace(‘female’, ‘FEMALE’, inplace=True)
end_time = time.time()
replace_time = end_time - start_time

print(“Time using replace(): {} sec”.format(replace_time))
图片

可以看到,与使用.loc()方法查找值的行和列索引并替换它相比,内置函数的快了157%。

print(‘The differnce: {} %’.format((pandas_time- replace_time )/replace_time*100))
图片

我们还可以使用列表替换多个值。比如说将所有WHITE NON-HISPANIC或WHITE NON-HISP都改为WNH。这里我们使用.loc[]函数和’ or '语句定位我们正在寻找的种族。然后进行替换赋值。

start_time = time.time()

names[‘Ethnicity’].loc[(names[“Ethnicity”] == ‘WHITE NON HISPANIC’) |
(names[“Ethnicity”] == ‘WHITE NON HISP’)] = ‘WNH’

end_time = time.time()
pandas_time= end_time - start_time
print(“Results from the above operation calculated in %s seconds” %(pandas_time))
图片

或者使用pandas内置.replace() 函数执行相同的操作,如下所示:

start_time = time.time()
names[‘Ethnicity’].replace([‘WHITE NON HISPANIC’,‘WHITE NON HISP’],
‘WNH’, inplace=True)

end_time = time.time()
replace_time = end_time - start_time

print(“Time using .replace(): {} sec”.format(replace_time))
图片

我们可以再次看到,使用.replace()方法比使用.loc[]方法快得多。为了更好地直观地了解它有多快,让我们运行下面的代码:

print(‘The differnce: {} %’.format((pandas_time- replace_time )/replace_time*100))
图片

.replace()方法比使用.loc[]方法快87%。如果数据很大,需要大量的清理,它将有效的减少数据清理的计算时间,并使pandas代码更快。

最后,我们还可以使用字典替换DataFrame中的单个值和多个值。如果想在一个命令中使用多个替换函数,这将是非常有用的。

我们要用字典把每个男性的性别替换为BOY,把每个女性的性别替换为GIRL。

names = pd.read_csv(‘Popular_Baby_Names.csv’)

start_time = time.time()
names[‘Gender’].replace({‘MALE’:‘BOY’, ‘FEMALE’:‘GIRL’, ‘female’: ‘girl’}, inplace=True)
end_time = time.time()
dict_time = end_time - start_time
print(“Time using .replace() with dictionary: {} sec”.format(dict_time))
图片

names = pd.read_csv(‘Popular_Baby_Names.csv’)

start_time = time.time()

names[‘Gender’].replace(‘MALE’, ‘BOY’, inplace=True)
names[‘Gender’].replace(‘FEMALE’, ‘GIRL’, inplace=True)
names[‘Gender’].replace(‘female’, ‘girl’, inplace=True)

end_time = time.time()

list_time = end_time - start_time
print(“Time using multiple .replace(): {} sec”.format(list_time))
图片

比较这两种方法,可以看到使用字典的运行速度快了大约22%。

使用字典可以替换几个不同列上的相同值。我们想把所有种族分成三大类:黑人、亚洲人和白人。这里的代码也非常简单。使用嵌套字典:外键是我们要替换值的列名。值是另一个字典,其中的键是要替换的字典。

start_time = time.time()
names.replace({‘Ethnicity’: {‘ASIAN AND PACI’: ‘ASIAN’, ‘ASIAN AND PACIFIC ISLANDER’: ‘ASIAN’,
‘BLACK NON HISPANIC’: ‘BLACK’, ‘BLACK NON HISP’: ‘BLACK’,
‘WHITE NON HISPANIC’: ‘WHITE’, ‘WHITE NON HISP’: ‘WHITE’}})
print(“Time using .replace() with dictionary: {} sec”.format (time.time() - start_time))
总结
使用.iloc[]函数可以更快地选择行和列并且它比loc[]要快,但是loc[] 提供了一些更方便的功能,如果速度不是优先考虑或者iloc[]实现的比较麻烦的话,再考虑使用loc[]。

使用内置的replace()函数比使用传统方法快得多。

使用python字典替换多个值比使用列表更快。

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

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

相关文章

Docker 学习笔记一

一、什么是docker Docker 是一个基于轻量级虚拟化技术的容器,整个项目基于Go语言开发;Docker是一个C/S架构,后端众多模块各司其职,docker的daemon是运行在主机上通过client可以进行通信。 docker 由三部分组成:镜像(…

使用Seata实现分布式事务真香!

之前分享了六种分布式事务方案: 本地消息表:如何通过本地消息表实现分布式事务 最大努力通知:如何使用最大努力通知实现分布式事务?与本地消息表区别? XA模式:用二阶段三阶段提交实现分布式事务 TCC模式…

【820复试】数据结构面试问题

文章目录 1.用循环比递归的效率高吗2.顺序表和链表的比较3.头指针和头结点的区别4.如何区分循环队列是队满还是队空?5.栈在通过后缀表达式求值的算法思想6.栈在递归中的应用7.队列在层次遍历中的作用8.队列在计算机系统中的应用9.矩阵的压缩存储10.串的模式匹配11.如…

解析编程中不可或缺的基础:深入了解结构体类型

精琢博客,希望可以给大家带来收获~ 博主主页:17_Kevin-CSDN博客 收录专栏:《C语言》 引言 在编程中,结构体是一种自定义的数据类型,它允许开发人员将不同类型的数据组合在一起,并为其定义相关属性和行为。…

服务端出现大量的time_wait,如何排差和解决?

出现大量的TIME_WAIT状态通常是由于网络连接的频繁创建和关闭所导致的。TIME_WAIT状态是TCP连接关闭后的一种状态,在该状态下,连接的端口在一段时间内仍然被保留,以确保延迟的数据包不会在网络中出现问题。 要排查和解决大量的TIME_WAIT状态…

uniapp 跳转返回携带参数(超好用)

天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/ 1.返回界面 uni.$emit(enterPeople, this.entryList)uni.navigateBack({delta: 1}) 2.返回到的界面(接收数据界面) onShow() {let that thisuni.$on(enterPeople,function(enterPeopledata){console.…

跳出循环及数组部分方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 for循环forEach3、filtereverysome for循环 1、continue&#xff1b;跳出当次循环&#xff0c;进行下一个循环; function ceshi(){for(var i 0 ; i < 6 ; i){if…

YOLOv8 | 添加注意力机制报错KeyError:已解决,详细步骤

目录 添加注意力机制报错 报错的原因 注意事项 解决错误流程 代码分享 ⭐欢迎大家订阅我的专栏一起学习⭐ &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680;&#x1f680; YOLOv5涨点专栏&#xff1a;h…

重学SpringBoot3-ServletWebServerFactoryAutoConfiguration类

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-ServletWebServerFactoryAutoConfiguration类 工作原理关键组件以TomcatServletWebServerFactory为例ServletWebServerFactory会创建webServer的时机关键…

25考研数据结构复习·3.2队列

队列&#xff08;Queue&#xff09;基本概念 定义 队列&#xff08;Queue&#xff09;时只允许在一端进行插入&#xff0c;在另一端删除的线性表。 特点&#xff1a;先进入队列的元素先出队 先进先出 First In First Out(FIFO) 重要术语 队头、队尾、空队列 基本操作 创、销 I…

页面配置、网络数据请求

1. 页面配置文件的作用 小程序中&#xff0c;每个页面都有自己的 .json 配置文件&#xff0c;用来对当前页面的窗口外观、页面效果等进行配置。 2. 页面配置和全局配置的关系 小程序中&#xff0c; app.json 中的 window 节点&#xff0c;可以全局配置小程序中每个页面的窗口…

网络编程-套接字相关基础知识

1.1. Socket简介 套接字&#xff08;socket&#xff09;是一种通信机制&#xff0c;凭借这种机制&#xff0c; 客户端<->服务器 模型的通信方式既可以在本地设备上进行&#xff0c;也可以跨网络进行。 Socket英文原意是“孔”或者“插座”的意思&#xff0c;在网络编程…

凝聚层次聚类算法详解

一、引言 聚类分析是数据挖掘和机器学习领域中的一种重要技术&#xff0c;用于将相似的对象分组在一起。层次聚类是聚类分析中的一种方法&#xff0c;它通过对数据集进行层次分解来满足特定的条件。在层次聚类中&#xff0c;凝聚层次聚类是一种自底向上的策略&#xff0c;它首…

Java初阶数据结构二叉树实现+练习完整(工程文件后序会进行上传)

i1.二叉树的概念 1.二叉树的定义 &#xff08;1&#xff09;二叉树可以是一个节点的有限集合 &#xff08;2&#xff09;可以为空 &#xff08;3&#xff09;或者是由一个根节点加上两棵分别称为左子树和右子树的二叉树组成的 &#xff08;4&#xff09;二叉树的每一个节点…

openGauss/MogDB调用C FUNCTION

openGauss/MogDB 调用 C FUNCTION 摘要 之前写过一篇关于postgresql 自定义函数实现&#xff0c;通过 contrib 模块进行扩展的帖子&#xff0c;今天和恩墨工程师进行了一些交流&#xff0c;在 MogDB 中也可以实现同样的功能&#xff0c;原以为需要完整的 openGauss 的源码才能…

突破编程_C++_C++11新特性(function与bind绑定器)

1 可调用对象 C 中的可调用对象&#xff08;Callable Objects&#xff09;是指那些能够被调用执行的对象。这包括了函数、函数对象&#xff08;也叫做仿函数&#xff0c;即重载了 operator() 的类或者结构体&#xff09;、Lambda 表达式以及任何具有 operator() 的成员函数的对…

WPF Command

WPF COMMAND在Windows Presentation Foundation&#xff08;WPF&#xff09;框架中是一个设计模式&#xff0c;主要用于实现用户界面&#xff08;UI&#xff09;元素和业务逻辑之间的松耦合交互。具体来说&#xff0c;它是MVVM&#xff08;Model-View-ViewModel&#xff09;架构…

C语言经典面试题目(十一)

1、如何在C语言中进行动态内存分配的错误处理&#xff1f; 在C语言中进行动态内存分配时&#xff0c;需要注意处理内存分配失败的情况。常见的错误处理方式包括&#xff1a; 使用 malloc、calloc 或 realloc 函数进行内存分配后&#xff0c;检查返回的指针是否为 NULL&#x…

PyTorch学习笔记之基础函数篇(十一)

文章目录 7 元素级别的数学运算7.1 torch.abs() 函数7.2 torch.cos() 函数7.3 torch.acos() 函数7.4 torch.add()函数 7 元素级别的数学运算 7.1 torch.abs() 函数 在PyTorch中&#xff0c;torch.abs 函数用于计算张量中每个元素的绝对值。这个函数会返回一个新的张量&#x…

python爬虫实战——抖音

目录 1、分析主页作品列表标签结构 2、进入作品页前 判断作品是视频作品还是图文作品 3、进入视频作品页面&#xff0c;获取视频 4、进入图文作品页面&#xff0c;获取图片 5、完整参考代码 6、获取全部作品的一种方法 本文主要使用 selenium.webdriver&#xff08;Firef…