0

0

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

聖光之護

聖光之護

发布时间:2025-09-04 16:36:15

|

830人浏览过

|

来源于php中文网

原创

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()方法结合正则表达式是实现这一目标的理想工具

文心快码
文心快码

文心快码(Comate)是百度推出的一款AI辅助编程工具

下载
  • ^(\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在数据处理方面的强大功能和灵活性,是每个数据分析师和工程师都应掌握的关键技能。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

715

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

625

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

739

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1235

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

575

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

699

2023.08.11

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 2.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号