如何基于列前两位字符匹配两个DataFrame的列?求高效方案
高效实现两个DataFrame按列前两位字符配对
问题描述
需要将两个DataFrame的列进行配对,匹配规则为当df1的col1字段前两位字符与df2的col2字段前两位字符相同时,视为匹配。
示例数据
import pandas as pd # df1数据 df1 = pd.DataFrame({ 'col1': ["'summer'", "'good heather'", "'sooner come'", "'keep up great work'", "'really'"] }) # df2数据 df2 = pd.DataFrame({ 'col2': ["'nice to be'", "'good'", "'remember'", "'recall me'"] })
期望输出
col1 col2 0 'good heather' 'good' 1 'really' 'remember' 2 'really' 'recall me'
由于处理的是大规模数据集,需要高效的实现方法。
高效解决方案
方法一:字典映射法(最优大规模数据场景)
该方法通过预处理构建前缀映射字典,避免生成笛卡尔积式的中间结果,大幅降低内存占用和时间消耗,时间复杂度为O(M+N)(M、N分别为df2、df1的行数)。
from collections import defaultdict import pandas as pd # 预处理df2:构建前缀到col2值的映射字典 prefix_map = defaultdict(list) for val in df2['col2']: # 提取前两位字符作为匹配键 prefix = val[:2] prefix_map[prefix].append(val) # 遍历df1生成所有匹配对 matches = [] for col1_val in df1['col1']: prefix = col1_val[:2] if prefix in prefix_map: # 遍历对应前缀的所有col2值,生成配对 for col2_val in prefix_map[prefix]: matches.append({'col1': col1_val, 'col2': col2_val}) # 转换为结果DataFrame result_df = pd.DataFrame(matches) print(result_df)
方法二:Pandas Merge法(适合中小规模数据)
如果数据规模适中,可以用Pandas的merge方法快速实现,但要注意当重复前缀较多时,会生成大量中间匹配行,内存占用较高。
import pandas as pd # 向量化提取前缀列 df1['prefix'] = df1['col1'].str[:2] df2['prefix'] = df2['col2'].str[:2] # 按前缀合并,得到所有匹配对 result_df = df1.merge(df2, on='prefix', how='inner').drop(columns='prefix') print(result_df)
方案对比
- 字典映射法:适合超大规模数据集,逐行处理无需加载全量中间结果,内存友好,时间效率高。
- Merge法:代码简洁,适合中小规模数据,但重复前缀较多时内存压力大。
内容的提问来源于stack exchange,提问作者user15649753
相关产品推荐
相关产品推荐

