展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > Pandas字符串映射合并技巧详解

Pandas字符串映射合并技巧详解

本文详细介绍了如何使用Pandas高效地处理两个DataFrame之间基于复杂条件的关联。通过演示从字符串列中提取数字作为匹配键,并利用Series.map()函数实现数据映射,解决了传统合并方法在键格式不匹配时的挑战,最终将外部数据精确地添加到目标DataFrame中。

Pandas数据合并技巧:基于字符串提取和映射实现条件关联

本文详细介绍了如何使用Pandas高效地处理两个DataFrame之间基于复杂条件的关联。通过演示从字符串列中提取数字作为匹配键,并利用Series.map()函数实现数据映射,解决了传统合并方法在键格式不匹配时的挑战,最终将外部数据精确地添加到目标DataFrame中。

引言:处理复杂条件下的DataFrame数据关联

在数据分析和处理过程中,我们经常需要将分散在不同数据集中的信息关联起来。Pandas库提供了强大的数据合并(merge)和连接(join)功能,但有时关联键的格式并不直接匹配,例如,一个DataFrame中的键是包含数字的字符串(如“1st”),而另一个DataFrame的键是纯数字索引。本文将详细阐述如何利用Pandas的字符串处理和映射功能,优雅地解决这类复杂条件下的数据关联问题。

数据准备与问题阐述

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

df1包含birthdate和ceremony_number两列,其中ceremony_number是包含数字和文本的字符串。 df2包含一个日期列dates,其索引(index)代表了某个事件的序号。

我们的目标是:根据df1中ceremony_number列里提取出的数字(例如从“1st”提取出“1”),去匹配df2的索引,并将df2中对应的dates值作为新列date_oscar添加到df1中。

示例代码:初始DataFrame构建

import pandas as pd

# 原始 df1 数据
data1 = {'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 数据 (注意其索引从1开始)
data2 = {'dates': {1: '1929-05-16', 2: '1930-04-03', 3: '1930-11-05'}}
df2 = pd.DataFrame(data2)

print("原始 df1:")
print(df1)
print("\n原始 df2:")
print(df2)

输出:

原始 df1:
  birthdate ceremony_number
0 9/30/1895             1st
1 7/23/1884             1st
2 3/29/1889             2nd
3 4/10/1868             3rd
4  4/8/1892             2nd

原始 df2:
        dates
1  1929-05-16
2  1930-04-03
3  1930-11-05

直接使用pd.merge()函数无法完成此任务,因为df1['ceremony_number']是字符串,而df2的匹配键是整数索引。此外,尝试通过循环df1.iterrows()来逐行匹配并追加数据是一种低效且容易出错的方法,应尽量避免在Pandas中使用。

解决方案:字符串提取与Series映射

解决此问题的核心在于两个步骤:首先,从df1的ceremony_number列中精确提取出数字部分;其次,利用Pandas的Series.map()功能将这些提取出的数字与df2的索引进行匹配,并获取对应的日期值。

步骤一:数据类型标准化

在进行任何日期相关的操作之前,将日期字符串转换为Pandas的datetime类型是一个良好的实践。这不仅能确保数据的一致性,也便于后续的日期计算或格式化。

# 将日期列转换为 datetime 类型
df1['birthdate'] = pd.to_datetime(df1['birthdate'], format='%m/%d/%Y')
df2['dates'] = pd.to_datetime(df2['dates'], format='%Y-%m-%d')

print("\n转换日期类型后的 df1:")
print(df1)
print("\n转换日期类型后的 df2:")
print(df2)

输出:

转换日期类型后的 df1:
   birthdate ceremony_number
0 1895-09-30             1st
1 1884-07-23             1st
2 1889-03-29             2nd
3 1868-04-10             3rd
4 1892-04-08             2nd

转换日期类型后的 df2:
       dates
1 1929-05-16
2 1930-04-03
3 1930-11-05

步骤二:从字符串中提取匹配键

我们需要从df1['ceremony_number']列中的“1st”、“2nd”等字符串中提取出数字“1”、“2”等。Pandas的Series.str.extract()方法结合正则表达式是实现这一目标的理想工具。

  • ^(\d+):这是一个正则表达式,^表示字符串的开始,\d+表示匹配一个或多个数字,括号()用于捕获匹配到的数字。
  • expand=False:此参数确保str.extract()返回一个Series而不是一个DataFrame,这更适合后续的映射操作。
  • astype(int):将提取出的字符串数字转换为整数类型,以便与df2的整数索引进行精确匹配。
# 从 'ceremony_number' 中提取数字并转换为整数
extracted_num = df1['ceremony_number'].str.extract('^(\d+)', expand=False).astype(int)
print("\n从 'ceremony_number' 提取出的数字键:")
print(extracted_num)

输出:

从 'ceremony_number' 提取出的数字键:
0    1
1    1
2    2
3    3
4    2
Name: ceremony_number, dtype: int32

步骤三:利用Series.map()进行高效映射

现在我们有了df1中用于匹配的数字键(extracted_num Series),以及df2中作为查找表的dates列(其索引是匹配键)。Pandas的Series.map()方法是执行此映射操作的完美选择。

当map()方法接收一个Series作为参数时,它会使用该参数Series的索引作为查找键,其值作为返回结果。在本例中,df2['dates']的索引是1, 2, 3,对应的值是日期。extracted_num中的每个值都会在df2.index中查找,并返回df2['dates']中对应的值。

# 使用提取出的数字作为键,通过 df2['dates'] 进行映射
df1['date_oscar'] = extracted_num.map(df2['dates'])

完整示例与结果验证

将上述所有步骤整合起来,形成一个完整的解决方案代码块:

import pandas as pd

# 1. 原始数据准备
data1 = {'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)

data2 = {'dates': {1: '1929-05-16', 2: '1930-04-03', 3: '1930-11-05'}}
df2 = pd.DataFrame(data2)

# 2. 数据类型标准化
df1['birthdate'] = pd.to_datetime(df1['birthdate'], format='%m/%d/%Y')
df2['dates'] = pd.to_datetime(df2['dates'], format='%Y-%m-%d')

# 3. 从 'ceremony_number' 中提取数字并转换为整数
num = df1['ceremony_number'].str.extract('^(\d+)', expand=False).astype(int)

# 4. 使用提取出的数字作为键,通过 df2['dates'] 进行映射
df1['date_oscar'] = num.map(df2['dates'])

print("\n最终 df1 (包含 'date_oscar' 列):")
print(df1)

最终输出:

最终 df1 (包含 'date_oscar' 列):
   birthdate ceremony_number date_oscar
0 1895-09-30             1st 1929-05-16
1 1884-07-23             1st 1929-05-16
2 1889-03-29             2nd 1930-04-03
3 1868-04-10             3rd 1930-11-05
4 1892-04-08             2nd 1930-04-03

从结果可以看出,df1成功地添加了date_oscar列,并且其中的日期值根据ceremony_number与df2的索引正确匹配。例如,ceremony_number为“1st”的行被映射到了df2索引为1的日期1929-05-16。

注意事项与最佳实践

  1. 效率优先: Pandas的向量化操作(如str.extract()和map())比Python原生的循环(如for index, row in df.iterrows():)效率高出几个数量级,尤其是在处理大型数据集时。始终优先考虑使用Pandas内置的向量化函数。
  2. 数据类型一致性: 在进行数据匹配或合并之前,确保所有参与比较的键具有相同的数据类型(例如,都是整数或都是字符串)至关重要。本文通过astype(int)实现了这一点。
  3. 正则表达式的灵活性: str.extract()结合正则表达式能够处理各种复杂的字符串模式提取需求,是数据清洗和准备的强大工具。根据实际的字符串格式调整正则表达式即可。
  4. map()的强大功能: Series.map()是执行一对一或多对一映射的利器。它可以接受字典、Series或函数作为参数,在需要根据一个Series的值去查找另一个Series或字典中的对应值时非常有用。

总结

本文提供了一个清晰、高效的Pandas解决方案,用于处理两个DataFrame之间基于字符串提取和映射的条件关联。通过将ceremony_number列中的数字部分提取出来并转换为整数,然后利用Series.map()功能与df2的索引进行匹配,我们成功地将所需数据合并到df1中。这种方法不仅解决了特定场景下的数据关联难题,也体现了Pandas在数据处理方面的强大功能和灵活性,是每个数据分析师和工程师都应掌握的关键技能。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。