Pandas进阶:拼接 concat 使用方法

1.处理索引和轴

假设我们有2个关于考试成绩的数据集。

df1 = pd.DataFrame({ 'name':['A','B','C','D'],'math':[60,89,82,70],'physics':[66, 95,83,66],'chemistry':[61,91,77,70] 
})
df2 = pd.DataFrame({ 'name':['E','F','G','H'],'math':[66,95,83,66],'physics':[60, 89,82,70],'chemistry':[90,81,78,90] 
})

最简单的用法就是传递一个含有DataFrames的列表,例如[df1, df2]。默认情况下,它是沿axis=0垂直连接的,并且默认情况下会保留df1和df2原来的索引。

pd.concat([df1,df2])

图片

如果想要合并后忽略原来的索引,可以通过设置参数ignore_index=True,这样索引就可以从0到n-1自动排序了。

pd.concat([df1,df2],ignore_index = True)

图片

如果想要沿水平轴连接两个DataFrame,可以设置参数axis=1

pd.concat([df1,df2],axis = 1)

图片

以上是一些基本操作,我们继续往下看。

2.避免重复索引

我们知道了concat()函数会默认保留原dataframe的索引。那有些情况,我想保留原来的索引,并且我还想验证合并后的结果是否有重复的索引,该怎么办呢?

可以通过设置参数verify_integrity=True,将此设置True为时,如果存在重复的索引,将会报错。比如下面这样。

try:pd.concat([df1,df2], verify_integrity=True)
except ValueError as e:print('ValueError', e)
ValueError: Indexes have overlapping values: Int64Index([0, 1, 2, 3], dtype='int64')

3.使用keys和names选项添加层次结构索引

添加层次结构索引非常的有用,可以进行更多层的数据分析。

举个例子,某些情况下我们并不想合并两个dataframe的索引,而是想为两个数据集贴上标签。比如我们分别为df1df2添加标签Year 1Year 2

这种情况,我们只需指定keys参数即可。

res = pd.concat([df1,df2],keys = ['Year 1','Year 2'])
res

图片

如果我们想要获取Year 1的数据集,可以直接使用loc像下面这样操作:

res.loc['Year 1']

另外,参数names可用于为所得的层次索引添加名称。例如,将名称Class添加到刚创建的的标签上。

pd.concat([df1,df2],keys = ['Year 1','Year 2'],names = ['Class',None],
)

图片

如果要重置索引并将其转换为数据列,可以使用 reset_index(),这一步操作也是非常的实用。

pd.concat([df1, df2], keys=['Year 1', 'Year 2'],names=['Class', None],
).reset_index(level=0)   
# reset_index(level='Class')

图片

4.列匹配和排序

concat()函数还可以将合并后的列按不同顺序排序。虽然,它会自动将两个df的列对齐合并。但默认情况下,生成的DataFrame与第一个DataFrame具有相同的列排序。例如,在以下示例中,其顺序与df1相同。

图片

如果想要按字母顺序对结果DataFrame进行排序,则可以设置参数sort=True

pd.concat([df1, df2], sort=True)

图片

或者也可以自定义排序,像下面这样:

custom_sort = ['math', 'chemistry', 'physics', 'name']
res = pd.concat([df1, df2])
res[custom_sort]

图片

5.连接CSV文件数据集

假设我们需要从一堆CSV文件中加载并连接数据集。常规做法,我们可能会使用for循环解决,比如下面这样。

import pathlib2 as pl2
ps = pl2.Path('data/sp3')
res = None
for p in ps.glob('*.csv'):if res is None:res = pd.read_csv(p)else:res = pd.concat([res, pd.read_csv(p)])

但上面pd.concat()在每次for循环迭代中都会被调用一次,效率不高,推荐使用列表推导式的写法。

import pathlib2 as pl2
ps = pl2.Path('data/sp3')
dfs = (pd.read_csv(p, encoding='utf8') for p in ps.glob('*.csv')
)
res = pd.concat(dfs)
res

这样就可以用一行代码读取所有CSV文件并生成DataFrames的列表dfs。然后,我们只需要调用pd.concat(dfs)一次即可获得相同的结果,简洁高效。

使用%%timeit测试下上面两种写法的时间,第二种列表推导式大概省了一半时间。

# for-loop solution
298 ms ± 11.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# list comprehension solution
153 ms ± 6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

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

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

相关文章

springBoot整合task

springBoot整合task 文章目录 springBoot整合task开开关设置任务,并设置执行周期定时任务的相关配置 开开关 设置任务,并设置执行周期 Component public class MyBean {Scheduled(cron "0/1 * * * * ?")public void print(){System.out.prin…

C++进阶篇6---C++11新语法

目录 目录 一、统一的列表初始化 二、声明 1.auto 2.decltype 3.nullptr 三、范围for 四、STL中的变化 五、右值引用和移动语义(重点) 一、统一的列表初始化 在c11之前,我们能用{}初始化数组和结构体 struct Point {int x;int y; }; int main() {int a[] …

机器学习 - 导论

简单了解 机器学习关于数据集的概念 、

HCIP —— 双点重发布 + 路由策略 实验

目录 实验拓扑: 实验要求: 实验配置: 1.配置IP地址 2.配置动态路由协议 —— RIP 、 OSPF R1 RIP R4 OSPF R2 配置RIP、OSPF 双向重发布 R3配置RIP、OSPF 双向重发布 3.查询路由表学习情况 4.使用路由策略控制选路 R2 R3 5.检…

Linux shell编程学习笔记32:declare 命令

0 前言 在 Linux shell编程学习笔记16:bash中的关联数组https://blog.csdn.net/Purpleendurer/article/details/134053506?spm1001.2014.3001.5501 中,我们在定义关联数组时使用了declare命令。 其实,declare命令的功能不只是定义定义关…

排序算法介绍(三)选择排序

0. 简介 选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序是不稳…

超大规模集成电路设计----学习框架(一)

本文仅供学习,不作任何商业用途,严禁转载。绝大部分资料来自----数字集成电路——电路、系统与设计(第二版)及中国科学院段成华教授PPT 超大规模集成电路设计----学习框架(一) 这门课在学什么?这门课该怎么学&#xf…

Python---函数递归---练习:猴子吃桃问题(本文以递归算法 解法为主)

相关链接:Python---函数递归---练习:斐波那契数列(本文以递归算法为主)-CSDN博客 案例:猴子吃桃问题 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。…

类和对象——(5)定义对象数组

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 芳华没有草稿纸,我们永久不…

openEuler学习05-ssh升级到openssh-9.5p1

openEuler的版本是openEuler 20.03,ssh的版本是OpenSSH_8.2p1 [roottest ~]# more /etc/os-release NAME"openEuler" VERSION"20.03 (LTS-SP3)" ID"openEuler" VERSION_ID"20.03" PRETTY_NAME"openEuler 20.03 (LTS-…

【Google2023】利用TiDE进行长期预测实战(时间序列密集编码器)

一、本文介绍 大家好,最近在搞论文所以在研究各种论文的思想,这篇文章给大家带来的是TiDE模型由Goggle在2023.8年发布,其主要的核心思想是:基于多层感知机(MLP)构建的编码器-解码器架构,核心创…

Python---函数递归---练习:斐波那契数列(本文以递归算法为主)

编程思想: 如何利用数学模型,来解决对应的需求问题;然后利用代码实现对应的数据模型。 算法:使用代码实现对应的数学模型,从而解决对应的业务问题 程序 算法 数据结构 在经常使用的算法中,有两种非常…

RC低通滤波电路直接带载后会发生什么?

1、滤波的含义 滤波是频域范畴,它说的是不同频率的信号经过一个电路处理后,信号发生变化的问题,变化包含了原始信号幅值和相位的变化,滤波电路对信号的幅值做出的响应称为幅频响应,对信号相位做出的反应称为相频响应。…

设计模式---第五篇

系列文章目录 文章目录 系列文章目录前言一、知道观察者模式吗?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、知道观察者模式吗? 答:观察者模式是定义对…

逸学java【初级菜鸟篇】12.网络通讯编程

hi,我是逸尘,一起学java吧 目标(任务驱动) 请练掌网络通讯的内容。 局域网和互联网 局域网英文:Local Area Network,缩写:LAN,是指一群通过一定形式连接起来的计算机,…

Java封装讯飞星火大模型历险记

问题描述与分析 现状描述与目标 在使用讯飞星火大模型API的过程中,API的返回结果在可以在其他线程中进行分次打印,但是在main方法中直接打印返回结果,显示为空。这种情况下不利于二次封装,希望在main方法中获取完整的API返回结果…

Linux——基本指令(一)

写在前面: 我们云服务器搭建的Linux系统,使用的镜像版本CentOS 7.6,使用的Xshell远程连接云服务器 前面我们使用超级管理员root账号登录,一般我们使用普通用户登录,那么如何创建新用户呢? 1.创建新用户 &#xff08…

Ubuntu22.04无需命令行安装中文输入法

概要:Ubuntu22.04安装完成后,只需在设置中点点点即可完成中文输入法的安装,无需命令行。 一、安装中文语言包 1、点击屏幕右上角,如下图所示。 2、点击设置 3、选择地区与语言,点击管理已安装的语言 4、点击安装 5、输…

❀My学习Linux命令小记录(10)❀

目录 ❀My学习Linux命令小记录(10)❀ 36.fold指令 37.expr指令 38.iperf指令 39.telnet指令 40.ssh指令 ❀My学习Linux命令小记录(10)❀ 36.fold指令 功能说明:控制文件内容输出时所占用的屏幕宽度&#xff0c…

上门按摩APP小程序,抓住机遇创新服务新模式;

上门按摩APP小程序:抓住机遇,创新服务新模式; 随着现代人对生活质量要求的提高,上门按摩服务正成为一种新的、受欢迎的生活方式。通过APP小程序,用户可以轻松预约按摩服务,解决身体疲劳问题,享受…