
在数据处理过程中,我们经常会遇到需要将两个数据集(dataframe)进行合并或关联的情况。然而,合并键的格式可能不尽相同,例如,一个dataframe的键是“1st”、“2nd”这样的字符串,而另一个dataframe的键是纯数字(1、2、3)。在这种情况下,直接使用merge函数可能无法达到预期效果,需要对键进行预处理。
假设我们有两个DataFrame,df1和df2,结构如下:
df1
| birthdate | ceremony_number |
|---|---|
| 9/30/1895 | 1st |
| 7/23/1884 | 1st |
| 3/29/1889 | 2nd |
| 4/10/1868 | 3rd |
| 4/8/1892 | 2nd |
df2
| index | dates |
|---|---|
| 1 | 1929-05-16 |
| 2 | 1930-04-03 |
| 3 | 1930-11-05 |
我们的目标是根据df1中的ceremony_number列(例如,从“1st”中提取“1”)与df2的索引(或一个名为index的列)进行匹配,然后将df2中的dates列添加到df1中,作为新的date_oscar列。
首先,我们创建示例DataFrame并进行基本的数据类型转换,特别是日期列,将其转换为Pandas的datetime对象,这有助于后续的数据操作和一致性。
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
# 注意: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_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解决此问题的关键在于两个步骤:
# 步骤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_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
虽然map方法在此场景下非常高效和简洁,但也可以考虑其他方法:
DataFrame.merge():
# 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在添加单一列的场景下更为直接。
性能考量:
缺失值处理:
本教程展示了如何利用Pandas的str.extract和map方法,高效地解决两个DataFrame之间基于字符串键提取数字进行数据关联的问题。这种方法不仅代码简洁,而且由于使用了Pandas的矢量化操作,性能也远优于传统的循环处理方式。掌握这些技巧,将有助于你更灵活、高效地处理复杂的数据合并任务。
以上就是使用Pandas高效合并DataFrame:基于字符串键提取与映射的教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号