如何在Pandas中高效查找跨分组的字符串包含关系
提升Pandas字符串包含匹配效率的方案
你的双重循环写法时间复杂度为O(n²),数据量稍大就会大幅拖慢运行速度,以下是几种更高效的实现思路:
方法一:利用向量化操作替代显式循环
借助Pandas的向量化特性,直接生成两两组合的条件矩阵,避免逐行遍历:
import pandas as pd # 示例数据(替换为你的df5) data = { 'identifier': ['occupation', 'occupation', 'skill', 'department', 'skill'], 'matched_string': ['manager', 'manager', 'manager', 'marketing manager', 'marketing'] } df5 = pd.DataFrame(data) # 提取核心列 str_series = df5['matched_string'] id_series = df5['identifier'] # 生成所有字符串两两包含的布尔矩阵 contains_matrix = str_series.apply(lambda x: str_series.str.contains(x)) # 生成标识符不同的布尔矩阵 diff_id_matrix = id_series.values != id_series.values[:, None] # 合并两个条件:字符串包含且标识符不同 valid_matrix = contains_matrix & diff_id_matrix # 获取所有符合条件的索引对 valid_indices = set() for idx, row in valid_matrix.iterrows(): # 找到当前行满足条件的其他行索引 match_indices = row[row].index valid_indices.update([idx]) valid_indices.update(match_indices) # 提取结果并去重 df4 = df5.loc[list(valid_indices)].reset_index(drop=True) print(df4)
方法二:先去重减少计算量
原数据存在重复记录(比如前两行的occupation+manager),可以先对唯一记录计算,再映射回原数据,进一步降低运算量:
# 第一步:获取唯一记录 unique_df = df5.drop_duplicates().reset_index(drop=True) u_strs = unique_df['matched_string'] u_ids = unique_df['identifier'] # 生成条件矩阵 contains_matrix = u_strs.apply(lambda x: u_strs.str.contains(x)) diff_id_matrix = u_ids.values != u_ids.values[:, None] valid_matrix = contains_matrix & diff_id_matrix # 收集唯一记录中符合条件的行 valid_unique_indices = set() for idx, row in valid_matrix.iterrows(): match_indices = row[row].index valid_unique_indices.update([idx]) valid_unique_indices.update(match_indices) unique_result = unique_df.loc[list(valid_unique_indices)] # 第二步:映射回原数据,获取所有原始符合条件的记录 df4 = df5.merge(unique_result, on=['identifier', 'matched_string']) print(df4)
关键优化点
- 用Pandas内置的向量化运算替代Python层面的双重循环,充分利用底层C实现的高效性
- 去重步骤减少了需要计算的两两组合数,数据重复率越高,效率提升越明显
- 通过集合存储索引避免重复添加记录,保证结果简洁
内容的提问来源于stack exchange,提问作者julez8000
相关产品推荐
相关产品推荐

