基于pandas对比两个DataFrame并按子串匹配条件提取数据生成新表
解决方案
实现逻辑
我们需要判断df2中subdata列的每一个值,是否是df1fruit列任意值的子串,只要存在任意一个匹配就保留该行。
完整可运行代码
首先构造模拟数据验证效果,你可以直接替换成自己的真实DataFrame使用:
import pandas as pd # 构造示例df1,可替换为你的真实数据 df1 = pd.DataFrame({ 'fruit': ['apple', 'banana', 'grapes', 'blueberry', 'cherry'] }) # 构造示例df2,可替换为你的真实数据 df2 = pd.DataFrame({ 'subdata': ['nan', 'pple', 'che', 'lsls', 'lueberry', 'cherry', 'app'] }) # 核心筛选逻辑 fruit_list = df1['fruit'].tolist() # 对subdata每一个值x,判断是否有任意水果值包含x mask = df2['subdata'].apply(lambda x: any(x in fruit for fruit in fruit_list)) result_df = df2[mask]
结果验证
输出result_df即可得到符合要求的筛选结果,示例中会保留'nan'、'pple'、'che'、'lueberry'、'cherry'、'app'对应的行,剔除不匹配的'lsls'行,和你需求的匹配规则完全一致。
大数据量优化方案
如果你的df2数据量超过10万行,可以提前把所有fruit的所有子串去重存为集合,用isin判断替代逐行apply,运行效率会提升数倍:
# 预生成所有fruit的所有子串集合 all_substrings = set() for fruit in fruit_list: for i in range(len(fruit)): for j in range(i+1, len(fruit)+1): all_substrings.add(fruit[i:j]) # 直接用isin批量判断,速度更快 mask = df2['subdata'].isin(all_substrings) result_df = df2[mask]
内容的提问来源于stack exchange,提问作者user16600616
相关产品推荐
相关产品推荐

