使用Pandas高效合并DataFrame:基于字符串键提取与映射的教程

使用Pandas高效合并DataFrame:基于字符串键提取与映射的教程

本教程详细阐述了如何使用Python Pandas库,在两个DataFrame之间进行条件合并。当合并键存在于一个DataFrame的字符串列中,且需要提取数字部分与另一个DataFrame的索引或数字列匹配时,本教程提供了一种高效的解决方案。通过str.extract方法提取关键数字,并结合map函数实现精确的数据映射,从而避免了低效的循环操作,确保了代码的性能与可读性。

场景描述

在数据处理过程中,我们经常会遇到需要将两个数据集(dataframe)进行合并或关联的情况。然而,合并键的格式可能不尽相同,例如,一个dataframe的键是“1st”、“2nd”这样的字符串,而另一个dataframe的键是纯数字(1、2、3)。在这种情况下,直接使用merge函数可能无法达到预期效果,需要对键进行预处理。

假设我们有两个DataFrame,df1和df2,结构如下:

df1

birthdate ceremony_number

9/30/18951st7/23/18841st3/29/18892nd4/10/18683rd4/8/18922nd

df2

index dates

11929-05-1621930-04-0331930-11-05

我们的目标是根据df1中的ceremony_number列(例如,从“1st”中提取“1”)与df2的索引(或一个名为index的列)进行匹配,然后将df2中的dates列添加到df1中,作为新的date_oscar列。

数据准备

首先,我们创建示例DataFrame并进行基本的数据类型转换,特别是日期列,将其转换为Pandas的datetime对象,这有助于后续的数据操作和一致性。

import pandas as pd# 创建 df1data1 = {    'birthdate': {0: '9/30/1895', 1: '7/23/1884', 2: '3/29/1889',                  3: '4/10/1868', 4: '4/8/1892'},    'ceremony_number': {0: '1st', 1: '1st', 2: '2nd', 3: '3rd', 4: '2nd'}}df1 = pd.DataFrame(data1)# 创建 df2# 注意:df2的键是其索引,而不是一个单独的列data2 = {'dates': {1: '1929-05-16', 2: '1930-04-03', 3: '1930-11-05'}}df2 = pd.DataFrame(data2)# 将日期列转换为datetime对象df1['birthdate'] = pd.to_datetime(df1['birthdate'], format='%m/%d/%Y')df2['dates'] = pd.to_datetime(df2['dates'], format='%Y-%m-%d')print("原始 df1:")print(df1)print("n原始 df2:")print(df2)

输出:

原始 df1:   birthdate ceremony_number0 1895-09-30             1st1 1884-07-23             1st2 1889-03-29             2nd3 1868-04-10             3rd4 1892-04-08             2nd原始 df2:        dates1  1929-05-162  1930-04-033  1930-11-05

核心解决方案:提取与映射

解决此问题的关键在于两个步骤:

从df1[‘ceremony_number’]字符串中提取数字。使用提取出的数字作为键,将df2[‘dates’]的值映射到df1的新列中。

# 步骤1: 从 'ceremony_number' 列中提取数字# 使用正则表达式 '^(d+)' 匹配字符串开头的连续数字# expand=False 确保返回一个 Series 而不是 DataFrame# astype(int) 将提取到的字符串数字转换为整数类型,以便与 df2 的索引匹配extracted_numbers = df1['ceremony_number'].str.extract('^(d+)', expand=False).astype(int)# 步骤2: 使用 map 函数将 df2['dates'] 的值映射到 df1# map 方法接收一个 Series 或字典。当传入一个 Series 时,# map 会使用该 Series 的索引作为查找键,Series 的值作为映射结果。# 在这里,extracted_numbers 的每个值会作为键去 df2['dates'] 的索引中查找对应的值。df1['date_oscar'] = extracted_numbers.map(df2['dates'])print("n合并后的 df1:")print(df1)

输出:

合并后的 df1:   birthdate ceremony_number date_oscar0 1895-09-30             1st 1929-05-161 1884-07-23             1st 1929-05-162 1889-03-29             2nd 1930-04-033 1868-04-10             3rd 1930-11-054 1892-04-08             2nd 1930-04-03

关键技术解析

Series.str.extract(pat, expand=False):这是一个强大的字符串方法,用于从Series中的每个字符串元素中提取匹配正则表达式pat的子串。^(d+) 是一个正则表达式:^ 匹配字符串的开头。d+ 匹配一个或多个数字。() 创建一个捕获组,这意味着我们只提取括号内的内容。expand=False 参数确保返回一个Series,其中包含每个匹配的第一个捕获组。如果设置为True,则会返回一个DataFrame。Series.astype(int):将Series中的元素数据类型转换为整数。这是必要的,因为str.extract返回的是字符串,而df2的索引是整数。Series.map(arg):map方法是Pandas中用于元素级映射的利器。当arg是一个Series时,map会使用调用Series(这里是extracted_numbers)中的值作为键,去arg的索引中查找对应的值。如果某个键在arg的索引中找不到,则对应的结果将是NaN。

替代方案与注意事项

虽然map方法在此场景下非常高效和简洁,但也可以考虑其他方法:

DataFrame.merge():

如果df2的匹配键是一个常规列(而不是索引),或者需要进行更复杂的合并类型(如内连接、左连接等),merge会是更通用的选择。在使用merge之前,同样需要对df1[‘ceremony_number’]进行预处理,提取出数字,并可能需要重置df2的索引使其成为一个常规列。例如:

# df2_temp = df2.reset_index().rename(columns={'index': 'ceremony_index'})# df1['temp_key'] = df1['ceremony_number'].str.extract('^(d+)', expand=False).astype(int)# merged_df = pd.merge(df1, df2_temp, left_on='temp_key', right_on='ceremony_index', how='left')# df1['date_oscar'] = merged_df['dates']# df1.drop(columns=['temp_key'], inplace=True)

可以看出,map在添加单一列的场景下更为直接。

性能考量:

避免使用Python原生的for循环遍历DataFrame行,因为这通常效率低下,尤其对于大型数据集。Pandas的str访问器和map等方法都是高度优化的矢量化操作,能够显著提高性能。

缺失值处理:

如果extracted_numbers中的某个值在df2[‘dates’]的索引中找不到对应的项,map操作会自动填充NaN(Not a Number)值。在实际应用中,你可能需要进一步处理这些NaN值,例如填充默认值或删除包含NaN的行。

总结

本教程展示了如何利用Pandas的str.extract和map方法,高效地解决两个DataFrame之间基于字符串键提取数字进行数据关联的问题。这种方法不仅代码简洁,而且由于使用了Pandas的矢量化操作,性能也远优于传统的循环处理方式。掌握这些技巧,将有助于你更灵活、高效地处理复杂的数据合并任务。

以上就是使用Pandas高效合并DataFrame:基于字符串键提取与映射的教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1369993.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何管理Python项目的依赖?
上一篇 2025年12月14日 10:08:44
解决Django表单输入字段不显示问题:视图函数上下文传递关键
下一篇 2025年12月14日 10:08:47

相关推荐

  • Java中MAC地址到长整型的正确转换方法

    本文详细阐述了在java中将mac地址字符串正确转换为长整型数值的方法。针对常见的字符串拼接误区,文章深入分析了其错误原因,并提供了基于字节累积乘法运算的专业解决方案,确保48位mac地址能够准确无误地映射为64位长整型,便于存储、比较与处理。 引言 MAC地址(Media Access Contr…

    2026年9月7日
    200
  • 什么是爪哇?为什么在后端开发中受欢迎?

    Java凭借其跨平台兼容性、处理大型应用的能力以及可靠性,成为后端开发领域举足轻重的编程语言。自1995年由Sun Microsystems发布以来,Java已广泛应用于各种后端系统。 其在后端开发中的流行,源于以下几个关键优势: 跨平台运行: Java遵循“一次编写,随处运行”(WORA)原则。借…

    2026年9月7日
    100
  • 微软通杀漏洞-CVE-2021-1675复现

    微软通杀漏洞-CVE-2021-1675复现微软通杀漏洞-CVE-2021-1675复现微软通杀漏洞-CVE-2021-1675复现微软通杀漏洞-CVE-2021-1675复现

    环境 受害机:window2019(192.168.153.133) 攻击机:kali(192.168.153.134) 利用前提 或许需要:SeImpersonatePrivilege或SeAssignPrimaryTokenPrivilege权限 一定需要:一个普通的域用户 一定需要:开启Spo…

    2026年9月7日 用户投稿
    900
  • Python vs Java:比较概述

    Python和Java是当今最流行的编程语言,各有千秋。本文将从关键特性、语法差异及常见应用场景对这两种语言进行深入比较。 1. 语法对比:Hello World示例 Python “Hello World” 示例: # 简易Python程序year = 2024print(…

    2026年9月7日
    300
  • Win10设置path环境变量的方法

    Win10设置path环境变量的方法Win10设置path环境变量的方法Win10设置path环境变量的方法Win10设置path环境变量的方法

    路径环境变量对于电脑系统的正常运行以及各类应用程序的使用至关重要,尤其是在安装一些程序到临时目录时,可能需要手动配置用户或系统的环境变量。那么,windows 10如何设置路径环境变量呢? 方法/步骤 1、点击屏幕左下角的“开始”菜单,然后选择“此电脑”图标; 2、在打开的窗口中,点击顶部的“查看”…

    2026年9月7日 用户投稿
    200
  • 那些年我们开发的应用程序

    那些年我们开发的应用程序那些年我们开发的应用程序那些年我们开发的应用程序那些年我们开发的应用程序

    本文主要介绍了使用java和python语言在windows环境下开发的一些应用程序。所有的ui设计都是在无意识状态下创作的,灵感来源于生活。 weatherweather是一款由Java语言开发的天气预报应用程序,数据来源于Yahoo数据库。它支持22个国家的城市天气预报信息。 mp3_v2是一款…

    2026年9月6日 用户投稿
    200
  • 如何使用PHP在字符串中的名字之间添加空格

    使用PHP在字符串中的名字之间添加空格 本教程介绍如何使用PHP在连续的字符串中,通过正则表达式在名字之间插入空格。我们将使用preg_replace函数和一个特定的正则表达式模式,该模式能够识别小写字母和大写字母之间的边界,并在这些边界处插入空格,从而实现名字的分隔。 在处理包含多个名字的字符串时…

    2026年9月6日
    100
  • VSCode怎么建立JSP文件_VSCode创建和编辑JSP页面文件教程

    答案:在VSCode中创建和编辑JSP文件需安装Java Extension Pack和XML Language Support扩展,配置Java SDK及Maven/Gradle项目,添加servlet-api和jsp-api依赖,创建JSP文件后通过外部Tomcat等服务器部署,并可借助Tomc…

    2026年9月6日
    300
  • MySQL数据清洗与转换实战_Sublime处理批量字段标准化脚本流程

    MySQL数据清洗与转换实战_Sublime处理批量字段标准化脚本流程MySQL数据清洗与转换实战_Sublime处理批量字段标准化脚本流程MySQL数据清洗与转换实战_Sublime处理批量字段标准化脚本流程MySQL数据清洗与转换实战_Sublime处理批量字段标准化脚本流程

    使用sublime text进行mysql字段批量标准化的核心流程包括:①导出schema或数据样本;②定义标准化规则;③利用多光标、列选择和正则替换进行批量编辑;④生成alter table或update语句;⑤审查测试后执行sql脚本。其优势在于文本处理灵活、可控性强、轻量高效,适用于高度定制化…

    2026年9月6日 用户投稿
    400
  • python如何操作mysql

    python如何操作mysqlpython如何操作mysqlpython如何操作mysqlpython如何操作mysql

    python操作mysql的方法:首先输入命令行pip install pymysql进行导包;然后打开pycham编辑器创建python文件,输入import pymysql进行导包;最后通过游标来操作数据库。 本教程操作环境:windows7系统、mysql8.0.22&&pyt…

    2026年9月6日 用户投稿
    300
  • 智能外呼系统怎么搭建_TwilioAI外呼机器人配置指南

    答案是利用Twilio搭建智能外呼系统需注册账号获取API密钥、购买电话号码、配置Twilio函数与TwiML应用、编写外呼逻辑并可集成AI能力,最后测试优化及持续监控。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 智能外呼系统搭建的核心…

    2026年9月6日
    100
  • VSCode怎么设置注释头_VSCode自定义文件头注释与代码模板教程

    答案:通过VSCode内置用户代码片段和扩展实现自定义注释头与代码模板,提升开发效率、规范代码并支持自动更新。首先使用内置Snippets功能创建语言专属或全局代码片段,通过JSON定义前缀、内容及变量如$TM_FULLNAME和$CURRENT_YEAR等,实现快速插入文件头;其次,为实现新建文件…

    2026年9月6日
    200
  • VSCode怎么找到文件所在_VSCode文件定位与路径查看教程

    最直接的方法是右键点击文件标签或资源管理器中的文件,选择“Reveal in File Explorer”以在系统文件管理器中定位文件;此外还可通过“Copy Path”复制绝对路径、“Copy Relative Path”复制相对路径,或在集成终端使用${file}变量获取当前文件路径,即使文件不…

    2026年9月6日
    100
  • Python-Excel-openpyxl-05-新建工作簿/复制及新建工作表

    Python-Excel-openpyxl-05-新建工作簿/复制及新建工作表Python-Excel-openpyxl-05-新建工作簿/复制及新建工作表Python-Excel-openpyxl-05-新建工作簿/复制及新建工作表Python-Excel-openpyxl-05-新建工作簿/复制及新建工作表

    本系列文章将介绍如何使用python通过openpyxl模块操作excel文件。本文将重点讲解如何新建excel文件、复制现有工作表以及创建新工作表。 Part 1:示例 我们将创建一个名为openpyxl示例_5.xlsx的新工作簿,初始时它仅包含一个默认的工作表。我们将修改这个默认工作表的名称为…

    2026年9月6日 用户投稿
    100
  • 蓝桥云课之新手入门指南

    蓝桥云课之新手入门指南蓝桥云课之新手入门指南蓝桥云课之新手入门指南蓝桥云课之新手入门指南

    第一种,就是网页版的linux 蓝桥ROS课程也是这种模式: 蓝桥云课ROS机器人发布5年啦(原实验楼ROS机器人在线云实践课程) 环境是16.04 代码语言:javascript代码运行次数:0运行复制 #includeint main(){ printf(“Hello, Shiyanlou.”)…

    2026年9月5日 用户投稿
    100
  • VSCode怎么设置Tab键_VSCode调整Tab大小和缩进的相关配置教程

    VSCode中Tab行为由editor.tabSize和editor.insertSpaces控制,前者定义缩进宽度,后者决定插入空格或Tab字符。通过设置editor.detectIndentation可开启自动检测文件缩进风格,避免设置冲突。可在用户或工作区级别配置,亦可通过settings.j…

    2026年9月5日
    100
  • VSCode怎么跳转到方法_VSCode代码导航与函数定义跳转教程

    最直接的跳转方式是F12或Ctrl+点击,依赖语言服务器实现,若失灵需检查配置、扩展或项目文件,结合Peek Definition、Find All References等命令可提升导航效率。 VSCode中要跳转到方法定义,最直接、最常用的方式就是使用 Go to Definition 功能,通常…

    2026年9月5日
    100
  • pdf怎么合并_pdf如何合并

    合并pdf文件的方法有三种:使用在线工具时需注意安全性,优先选择知名平台;使用付费或开源软件如adobe acrobat、pdfelement等更安全且功能全面;程序员可用python脚本实现高效合并,如通过pypdf2库编写代码批量处理文件。每种方法各有优劣,用户可根据自身需求灵活选择。 合并PD…

    2026年9月5日
    300
  • VSCode中怎么快速注释_VSCode快速添加和移除注释的快捷键教程

    掌握VSCode注释快捷键可大幅提升效率:行注释用Ctrl+/(Win/Linux)或Cmd+/(macOS),块注释用Shift+Alt+A(Win/Linux)或Shift+Option+A(macOS),系统会根据文件类型自动匹配注释语法,如JavaScript用//和/ /,Python用#…

    2026年9月5日
    100
  • 实现一个python选课系统实例

      下面介绍一下自己写的python程序,主要是的知识点为sys、os、json、pickle的模块应用,python程序包的的使用,以及关于类的使用。   下面是我的程序目录:            bin是存放一些执行文件course.py下面是这个文件的内容: import sys,os#程序…

    2026年9月5日
    100

发表回复

登录后才能评论
关注微信