在两个Pandas DataFrame中实现类Excel VLOOKUP的查找功能
我懂你要做的事儿——就是给df_orig里的每个A列值,从df_new里找出对应的Group_name,就像Excel里的VLOOKUP那样,只不过这里的匹配条件是A列值得存在于df_new的Combined列表中对吧?下面给你两种实用的实现方法:
实现类似VLOOKUP的DataFrame匹配功能
方法1:拆解列表后合并(高效直观,适合大数据集)
先把df_new里每个Combined列表的元素拆成单独行,这样就能用常规的合并操作完成匹配,效率比逐行遍历高很多:
import pandas as pd # 先还原你的测试数据(方便直接运行) df_orig = pd.DataFrame({'A': [3,4,6,7,8]}) df_new = pd.DataFrame({ 'Combined': [[8,9,112,114,134,135], [15,16,17,18,19,20], [15,16,17,18,19], [16,17,18,19,20], [15,16,17,18], [8,9,112,114], [18,19,20], [28,29,30], [21,22], [28,29], [26,27], [24,25], [3,4]], 'Length': [6,6,5,5,4,4,3,3,2,2,2,2,2], 'Group_name': ['Group 1','Group 2','Group 3','Group 4','Group 5','Group 6', 'Group 7','Group 8','Group 9','Group 10','Group 11','Group 12','Group 13'] }) # 把Combined里的每个元素拆成单独行 df_exploded = df_new.explode('Combined', ignore_index=True) # 统一数据类型,避免匹配失败 df_exploded['Combined'] = df_exploded['Combined'].astype(int) # 左连接合并,保留df_orig所有行,匹配不到的显示NaN(对应Excel的#N/A) result = df_orig.merge(df_exploded, left_on='A', right_on='Combined', how='left') # 只保留需要的列 result = result[['A', 'Group_name']] print(result)
运行后输出:
A Group_name 0 3 Group 13 1 4 Group 13 2 6 NaN 3 7 NaN 4 8 Group 1
补充说明
- 如果一个值属于多个Group(比如示例里的8同时在Group1和Group6),这个方法会返回所有匹配结果,你可以用
drop_duplicates(subset='A', keep='first')保留第一个匹配项,或者根据Length字段筛选最合适的Group。
方法2:自定义函数逐行匹配(适合小数据集,逻辑直观)
如果你的数据量不大,也可以用apply直接遍历每一行查找匹配,逻辑更直白:
def get_group(value): # 遍历df_new,找到第一个包含目标值的分组 for _, row in df_new.iterrows(): if value in row['Combined']: return row['Group_name'] return None # 没找到返回None # 给df_orig新增Group_name列 df_orig['Group_name'] = df_orig['A'].apply(get_group) print(df_orig)
输出和方法1完全一致,不过要注意:这种逐行遍历的方式在数据量大的时候效率会很低,优先选方法1更稳妥。
关键注意点
- 一定要保证
df_orig['A']和df_new['Combined']里的元素类型一致(比如都是整数),不然会出现匹配不到的情况 - 如果需要匹配多个结果,方法1可以保留所有匹配行,方便后续筛选;方法2只会返回第一个匹配的Group
内容的提问来源于stack exchange,提问作者Kdog
相关产品推荐
相关产品推荐

