Pandas 合并数据集:concat 和 append

文章目录

  • Pandas 合并数据集:concat 和 append
    • 回顾:NumPy 数组的拼接
    • 使用 pd.concat 进行简单拼接
      • 重复索引
        • 将重复索引视为错误
        • 忽略索引
        • 添加多级索引(MultiIndex)键
      • 使用连接(Join)方式拼接
      • append 方法

Pandas 合并数据集:concat 和 append

封面

一些最有趣的数据研究来自于合并不同的数据源。
这些操作可以包括从非常简单的两个数据集的拼接,到更复杂的数据库式连接和合并,这些操作能够正确处理数据集之间的重叠部分。
SeriesDataFrame 都是为这种操作设计的,Pandas 提供了函数和方法,使得这种数据整理变得快速且简单。

在这里,我们将首先介绍如何使用 pd.concat 函数对 SeriesDataFrame 进行简单拼接;稍后我们会深入讲解 Pandas 中更复杂的内存合并和连接操作。

我们从标准的导入开始:

import pandas as pd
import numpy as np

为了方便起见,我们将定义一个函数,用于创建特定格式的 DataFrame,这将在接下来的示例中非常有用。

# 快速创建DataFrame
def make_df(cols, ind):"""快速创建一个DataFrame"""data = {c: [str(c) + str(i) for i in ind]for c in cols}return pd.DataFrame(data, ind)# 创建一个示例DataFrame
df1 = make_df(['A', 'B', 'C'], [1, 2])
df2 = make_df(['A', 'B', 'C'], [3, 4])
df1
ABC
1A1B1C1
2A2B2C2
df2
ABC
3A3B3C3
4A4B4C4
make_df('ABC', range(3))
ABC
0A0B0C0
1A1B1C1
2A2B2C2

此外,我们还将创建一个快速类,用于让我们能够并排显示多个 DataFrame。该代码利用了特殊的 _repr_html_ 方法,这是 IPython/Jupyter 用于实现其丰富对象显示的机制:

class display(object):"""Display HTML representation of multiple objects"""template = """<div style="float: left; padding: 10px;"><p style='font-family:"Courier New", Courier, monospace'>{0}</p>{1}</div>"""def __init__(self, *args):self.args = argsdef _repr_html_(self):return '\n'.join(self.template.format(a, eval(a)._repr_html_())for a in self.args)def __repr__(self):return '\n\n'.join(a + '\n' + repr(eval(a))for a in self.args)

随着我们在接下来的章节中继续讨论,这个类的用途将会变得更加清晰。

回顾:NumPy 数组的拼接

SeriesDataFrame 对象的拼接行为类似于 NumPy 数组的拼接,可以通过 np.concatenate 函数实现,相关内容可参考 NumPy 数组基础。
回顾一下,使用该函数可以将两个或多个数组的内容合并为一个数组:

x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
np.concatenate([x, y, z])
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

第一个参数是要连接的数组的列表或元组。
此外,对于多维数组,还可以使用 axis 关键字参数,指定沿哪个轴进行拼接:

x = [[1, 2],[3, 4]]
np.concatenate([x, x], axis=1)
array([[1, 2, 1, 2],[3, 4, 3, 4]])

使用 pd.concat 进行简单拼接

pd.concat 函数提供了类似于 np.concatenate 的语法,但包含了许多我们稍后会讨论的选项:

# Pandas v1.3.5 中的函数签名
pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None,levels=None, names=None, verify_integrity=False,sort=False, copy=True)

pd.concat 可以用于简单地拼接 SeriesDataFrame 对象,就像 np.concatenate 可以用于简单地拼接数组一样:

ser1 = pd.Series(['A', 'B', 'C'], index=[1, 2, 3])
ser2 = pd.Series(['D', 'E', 'F'], index=[4, 5, 6])
pd.concat([ser1, ser2])
1    A
2    B
3    C
4    D
5    E
6    F
dtype: object

它同样适用于拼接更高维度的对象,比如 DataFrame

df1 = make_df('AB', [1, 2])
df2 = make_df('AB', [3, 4])
display('df1', 'df2', 'pd.concat([df1, df2])')

df1

AB
1A1B1
2A2B2

df2

AB
3A3B3
4A4B4

pd.concat([df1, df2])

AB
1A1B1
2A2B2
3A3B3
4A4B4

它的默认行为是在 DataFrame 内按行拼接(即 axis=0)。
np.concatenate 类似,pd.concat 允许指定拼接所沿的轴。
请看下面的例子:

df3 = make_df('AB', [0, 1])
df4 = make_df('CD', [0, 1])
display('df3', 'df4', "pd.concat([df3, df4], axis='columns')")

df3

AB
0A0B0
1A1B1

df4

CD
0C0D0
1C1D1

pd.concat([df3, df4], axis='columns')

ABCD
0A0B0C0D0
1A1B1C1D1

我们同样可以指定 axis=1;这里我们使用了更直观的 axis='columns'

重复索引

np.concatenatepd.concat 之间的一个重要区别是,Pandas 的拼接操作会保留索引,即使结果中会出现重复的索引!
请看下面这个简短的例子:

x = make_df('AB', [0, 1])
y = make_df('AB', [2, 3])
y.index = x.index  # make indices match
display('x', 'y', 'pd.concat([x, y])')

x

AB
0A0B0
1A1B1

y

AB
0A2B2
1A3B3

pd.concat([x, y])

AB
0A0B0
1A1B1
0A2B2
1A3B3

注意结果中重复的索引。
虽然在 DataFrame 中这是允许的,但这种结果通常并不是我们想要的。
pd.concat 为我们提供了几种处理这种情况的方法。

将重复索引视为错误

如果你希望在 pd.concat 的结果中索引没有重叠,可以设置 verify_integrity 参数为 True
这样拼接时如果出现重复索引,就会抛出异常。
下面是一个示例,为了更清晰,我们会捕获并打印错误信息:

try:pd.concat([x, y], verify_integrity=True)
except ValueError as e:print("ValueError:", e)
ValueError: Indexes have overlapping values: Index([0, 1], dtype='int64')
忽略索引

有时候索引本身并不重要,你可能更希望直接忽略它。
可以通过设置 ignore_index 参数来实现这一点。
当该参数设为 True 时,拼接后的结果会为新的 DataFrame 创建一个新的整数索引:

display('x', 'y', 'pd.concat([x, y], ignore_index=True)')

x

AB
0A0B0
1A1B1

y

AB
0A2B2
1A3B3

pd.concat([x, y], ignore_index=True)

AB
0A0B0
1A1B1
2A2B2
3A3B3
添加多级索引(MultiIndex)键

另一种选择是使用 keys 选项为数据源指定标签;结果将是一个包含这些数据的分层索引(MultiIndex)序列:

display('x', 'y', "pd.concat([x, y], keys=['x', 'y'])")

x

AB
0A0B0
1A1B1

y

AB
0A2B2
1A3B3

pd.concat([x, y], keys=['x', 'y'])

AB
x0A0B0
1A1B1
y0A2B2
1A3B3

我们可以使用分层索引中讨论的工具,将这个多重索引的 DataFrame 转换为我们感兴趣的表示形式。

使用连接(Join)方式拼接

在前面的简短示例中,我们主要拼接的是具有相同列名的 DataFrame
实际上,来自不同数据源的数据可能具有不同的列集合,此时 pd.concat 提供了多种选项。
请看下面两个 DataFrame 的拼接示例,它们只有部分(而不是全部)列名相同:

df5 = make_df('ABC', [1, 2])
df6 = make_df('BCD', [3, 4])
display('df5', 'df6', 'pd.concat([df5, df6])')

df5

ABC
1A1B1C1
2A2B2C2

df6

BCD
3B3C3D3
4B4C4D4

pd.concat([df5, df6])

ABCD
1A1B1C1NaN
2A2B2C2NaN
3NaNB3C3D3
4NaNB4C4D4

默认行为是用 NA 值填充没有数据的位置。
要更改这一点,我们可以调整 concat 函数的 join 参数。
默认情况下,join 是输入列的并集(join='outer'),但我们也可以通过设置 join='inner',将其改为只保留列的交集:

display('df5', 'df6',"pd.concat([df5, df6], join='inner')")

df5

ABC
1A1B1C1
2A2B2C2

df6

BCD
3B3C3D3
4B4C4D4

pd.concat([df5, df6], join='inner')

BC
1B1C1
2B2C2
3B3C3
4B4C4

另一种有用的模式是在拼接前使用 reindex 方法,以更精细地控制哪些列被舍弃:

pd.concat([df5, df6.reindex(df5.columns, axis=1)])
ABC
1A1B1C1
2A2B2C2
3NaNB3C3
4NaNB4C4

append 方法

由于直接拼接数组非常常见,在Pandas 2.0.0版本之前,SeriesDataFrame 对象都提供了 append 方法,可以用更少的代码实现同样的功能。
但值得注意的是,自 Pandas 2.0.0 开始,不再支持append方法,故以下的示例将报 AttributeError。

display('df1', 'df2', 'df1.append(df2)')

请注意,与 Python 列表的 appendextend 方法不同,Pandas 中的 append 方法不会修改原始对象;它会创建一个包含合并数据的新对象。
此外,这种方法的效率并不高,因为它涉及新索引和数据缓冲区的创建。
因此,如果你打算进行多次 append 操作,通常更好的做法是先构建一个 DataFrame 对象的列表,然后一次性传递给 concat 函数。

Pandas有更强大的多数据源合并方法:pd.merge 实现的数据库式合并/连接。
关于 concatappend 及相关功能的更多信息,请参阅 Pandas 文档的“合并、连接、拼接与比较”部分。

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

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

相关文章

2025年5月架构设计师综合知识真题回顾,附参考答案、解析及所涉知识点(七)

本文主要回顾2025年上半年(2025-5-24)系统架构设计师考试上午综合知识科目的选择题,同时附带参考答案、解析和所涉知识点。 2025年5月架构设计师综合知识真题回顾,附参考答案、解析及所涉知识点(一) 2025年5月架构设计师综合知识真题回顾,附参考答案、解析及所涉知识点(…

面向RF设计人员的微带贴片天线计算器

微带贴片天线和阵列可能是仅次于单极天线和偶极天线的最简单的天线设计。这些天线也很容易集成到PCB中&#xff0c;因此通常用于5G天线阵列和雷达等高级系统。这些天线阵列在基谐模式和高阶模式下也遵循一组简单的设计方程&#xff0c;因此您甚至可以在不使用仿真工具的情况下设…

明基RD280U编程显示器深度测评:码农的「第二块键盘」竟然会发光?

文章目录前言一、开箱篇&#xff1a;当理工男遇到「俄罗斯套娃式包装」二、外观篇&#xff1a;深空灰的「代码容器」1. 桌面变形记2. 保护肩颈的人体工学设计三、显示篇&#xff1a;给代码做「光子嫩肤」1. 28寸超大大屏 3:2屏比 4K超清2.专业编程模式&#xff0c;让代码一目…

算法114. 二叉树展开为链表

题目&#xff1a;给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序遍历 顺序相同。…

智慧能源管理系统:点亮山东零碳园区的绿色引擎

一、概述在全球积极践行“双碳”目标的时代浪潮下&#xff0c;山东作为经济大省&#xff0c;正全力推动产业的绿色变革&#xff0c;零碳园区建设成为其中的关键一环。《山东省零碳园区建设方案》明确规划&#xff0c;到2027年建成15个左右省级零碳园区 &#xff0c;到2030年进一…

分布式日志分析平台(ELFK 与 EFK)理论

一、日志分析平台核心概念在分布式系统中&#xff0c;日志是系统运行状态监控、问题排查和业务分析的重要依据。随着系统规模扩大&#xff0c;单机日志管理方式已无法满足需求&#xff0c;分布式日志分析平台应运而生。其核心目标是实现日志的集中收集、统一处理、高效存储和可…

CoreShop微信小程序商城框架开启多租户-添加一个WPF客户端以便进行本地操作--读取店铺信息(6)

本节内容&#xff0c;使用登录的token进行店铺信息读取&#xff0c;顺利的话&#xff0c;进行EXCEL上传测试。 1。在后台编写 读取店铺信息代码 1.1 查看原来铺店信息在什么位置&#xff0c;店铺的表格为CoreCmsStore#region 获取列表// POST: Api/CoreCmsStore/GetPageList///…

UE5关卡蓝图能不能保存副本呀?

提问 关卡蓝图能不能保存副本呀&#xff1f; 回答 在 UE 里&#xff0c;“关卡蓝图&#xff08;Level Blueprint&#xff09;”本身其实是不能直接复制/保存成独立资源的&#xff0c;因为它和具体的 **Level&#xff08;.umap 文件&#xff09;**是绑定的——相当于一个“场景脚…

机器学习数据预处理学习报告

一、学习背景与目的在机器学习流程中&#xff0c;数据预处理是保障模型训练效果的关键环节。原始数据常存在缺失值、量纲不一致、特征格式不匹配等问题&#xff0c;直接影响模型对数据规律的学习。本次学习围绕 Pandas 与 Scikit-learn&#xff08;sklearn&#xff09;工具库&a…

git旧仓库迁移到新仓库

git旧仓库迁移到新仓库 A仓库(旧仓库)&#xff1a;git172.16.21.21:xxxx_software/Ni-Handler-Mgr.git B仓库(新仓库)&#xff1a;git172.16.11.11:yyyy/hostpc/ni-handler-mgr.git Step1 新建新仓库 创建新 GitHub 仓库‌ 在 GitHub 页面点击 “New repository”&#xff0c;命…

YOLO --- YOLOv5模型以及项目详解

YOLO — YOLOv5模型以及项目详解 文章目录YOLO --- YOLOv5模型以及项目详解一&#xff0c;开源地址二&#xff0c;改进点Focus 模块三&#xff0c;网络结构3.1 CSP1_X 与 CSP2_X3.2 自适应Anchor的计算3.3 激活函数3.3.1 SiLU3.3.2 Swish3.4 Bottleneck3.5 C33.5.1 BottleneckC…

Linux文本三剑客的使用及常见重点操作

文本三剑客指 Linux环境下的 grep&#xff08;搜索&#xff09;、sed&#xff08;编辑&#xff09;、awk&#xff08;分析&#xff09;三款用于文本处理的核心命令&#xff0c;三者分工明确、功能互补&#xff0c;是处理日志、配置文件、结构化数据等场景的 “刚需工具”。一、…

​​《开源字幕神器VideoCaptioner实战:基于Whisper+LLM的全链路方案,免费平替剪映会员》​​

&#x1f4cc; 大家好&#xff0c;我是智界工具库&#xff0c;每天分享好用实用且智能的开源项目&#xff0c;以及在JAVA语言开发中遇到的问题&#xff0c;如果本篇文章对您有所帮助&#xff0c;请帮我点个小赞小收藏小关注吧&#xff0c;谢谢喲&#xff01;&#x1f618; 博主…

redisIO模型

​​1. 总述核心​​“Redis采用了​​单线程的Reactor模型​​来处理网络IO和命令请求。其核心在于&#xff0c;​​它使用一个主线程通过IO多路复用机制来并发地处理大量的客户端连接&#xff0c;而实际的命令解析和执行则是单线程的​​。”这句话非常重要&#xff0c;它直接…

视觉采集模块的用法

一、图像源模块用法采集模块中最基础的单元就是图像源模块&#xff0c;其中图像的输入方式包括相机输入、本地图像、SDK三种。添加图像源后&#xff0c;需要对内部的参数进行对应的配置&#xff0c;正常我们连接相机后图像源选择我们对应的连接相机。配置所需要的相机参数&…

Linux下基于Electron的程序ibus输入法问题

Linux下基于Electron的程序ibus输入法问题 最近想体验一下KDE Plasma桌面&#xff0c;遇到一个问题&#xff0c;就是浏览器输入不了中文&#xff0c;Edge、Chrome都一样&#xff0c;当然它们都是基于Chromium的&#xff0c;出同样的问题很正常。后面发现Visual Code也有同样的问…

Ubuntu20系统上离线安装MongoDB

Ubuntu20系统上离线安装MongoDB 准备工作&#xff1a;下载安装包及依赖​ 下载MongoDB二进制包​ 在联网环境中访问MongoDB官网&#xff0c;选择以下配置&#xff1a; 下载地址&#xff1a;https://www.mongodb.com/try/download/community ​Version​&#xff1a;需与目标系统…

K-Means 聚类算法如何选择初始点

n_clusters 参数是告诉 K-Means 算法对 整个数据集 (X_scaled) 进行分簇。让我们分解一下这个过程的逻辑&#xff1a;目标&#xff1a;我们的目标不是要对数据进行分类&#xff0c;而是要从成百上千个数据点中&#xff0c;智能地挑选出大约30个点作为贝叶斯优化的“起点”。这些…

聚铭安全管家平台2.0实战解码 | 安服篇(四):重构威胁追溯体系

在企业安全运营中&#xff0c;两类问题常常让团队陷入被动 1、“看得见威胁&#xff0c;却追不到源头” 明明检测到多台内网设备遭攻击&#xff0c;却迟迟找不到攻击源头&#xff0c;更说不清攻击者用了什么手法&#xff0c;导致无法及时封禁或隔离。 2、“找到了源头&#xff…

【Microi吾码】:低代码加速业务和技术深度融合

目录 一.低代码优势&#xff1a; 1.1低代码平台和传统代码开发&#xff1a; 1.2低代码和0代码平台&#xff1a; 1.3低代码平台&#xff1a;Microi吾码 二.关于开源低代码平台&#xff1a;Microi吾码 2.1Mircroi吾码介绍&#xff1a; 2.2产品特点&#xff1a; 2.3产品团…