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,一经查实,立即删除!

相关文章

SCAU:前一个和后一个字符

前一个和后一个字符 Time Limit:1000MS Memory Limit:65535K 题型: 编程题 语言: G;GCC;VC 描述 编写程序,输入一个数字字符,输出其前一个和后一个的数字字符,如果输入的是0前一个输出 “first”,9后一个则输出“last”&…

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[] …

机器学习 - 导论

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

堆排序算法

目录 1.基本原理2.例子3.代码实现 本文主要介绍堆排序的原理、例子以及代码实现。 1.基本原理 堆排序(Heap Sort)是一种基于比较的排序算法,它的工作原理是首先将待排序的序列构造成一个大顶堆或小顶堆,然后交换堆顶元素和最后一…

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

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

C/C++ 快速排序

个人主页:仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏:算法_仍有未知等待探索的博客-CSDN博客 快速排序的思想——分治 目录 一、引言 二、讲解 1、步骤 2、代码 1.以左边界作为基准 2.以右边界作为基准 3.以中心点作为基准 …

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…

PostgreSQL中常用的几种连接池总结及更新

前言 PostgreSQL的多进程结构,使得在支持大规模连接的时候,服务器端显得比较吃亏。一般上了1000个连接以上的时候,系统就会受到很大影响。这个时候,使用连接池,优势就会突显出来了。 在云环境下,一个JAVA…

Redis quicklist源码+listpack源码(5.0版本以上的优化)

ziplist设计上的问题,每一次增删改都需要计算前面元素的空间和长度(prevlen),这种设计缺陷非常明显,因此引入了quicklist的设计。 quicklist quicklist实际就是双端链表,链表里的每一个节点都是ziplist&a…

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

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

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

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

曲线积分和路径无关条件和应用

文章目录 平面上曲线积分和路径无关条件曲线积分与路径无关的定义等价描述小结充要条件定理充分性必要性 说明 线积分与路径无关时的计算👺曲线积分与路径无关的三个等价命题等价结论 Newton-Leibniz二元函数形式积分路径的简化 应用例例 平面上曲线积分和路径无关条…

UVa1584环状序列题解

题目 长度为n的环状串有n种表示方法,分别为从某个位置开始顺时针得到,在这些排列中字典顺序最小的称“最小表示”。 如CTCC的最小表示为CCCT,CGAGTCAGCT的最小表示为AGCTCGAGTC。 提示:对于两个字符串,从第一个字符开始…

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