Pandas:从列表列取值匹配另一列表列并过滤对应数据
解决Pandas DataFrame的列表匹配与过滤问题
原始DataFrame结构
import pandas as pd sample_df = pd.DataFrame({'single_proj_name': [['jsfk'],['fhjk'],['ERRW'],['SJBAK']], 'single_item_list': [['ABC_123'],['DEF123'],['FAS324'],['HSJD123']], 'single_id':[[1234],[5678],[91011],[121314]], 'multi_proj_name':[['AAA','VVVV','SASD'],['QEWWQ','SFA','JKKK','fhjk'],['ERRW','TTTT'],['SJBAK','YYYY']], 'multi_item_list':[['XYZAV','ADS23','ABC_123'],['XYZAV','DEF123','ABC_123','SAJKF'],['QWER12','FAS324'],['JFAJKA','HSJD123']], 'multi_id':[[2167,2147,29481],[2313,57567,2321,7898],[1123,8775],[5237,43512]]})
需求说明
- 提取每行
single_item_list列中的值 - 在同一行的
multi_item_list列中搜索该值 - 若找到匹配项,仅保留
multi_item_list中的该匹配值,移除其他非匹配值 - 根据匹配项的位置,在
multi_id列表中保留对应位置的值,移除其他位置的值
尝试的错误代码
def func(df): return list(set(sample_df['single_item_list']) - set(sample_df['multi_item_list'])) sample_df['col3'] = sample_df.apply(func, axis = 1)
错误原因分析
- 函数错误引用全局的
sample_df,而非当前行的df参数 - 转集合操作会丢失列表的位置信息,无法对应到
multi_id的匹配位置 - 代码逻辑是求集合差集,与“保留匹配项”的需求完全相反
正确解决方案
自定义行处理函数,通过遍历找到匹配项的位置,再对multi_item_list和multi_id做定向过滤:
def filter_matches(row): # 提取当前行single_item_list的目标值(每行都是单元素列表) target_item = row['single_item_list'][0] # 获取当前行的多元素列表数据 multi_items = row['multi_item_list'] multi_ids = row['multi_id'] # 找出所有匹配项的索引位置 match_indices = [i for i, item in enumerate(multi_items) if item == target_item] # 根据索引过滤列表 filtered_items = [multi_items[i] for i in match_indices] filtered_ids = [multi_ids[i] for i in match_indices] # 更新当前行的对应列 row['multi_item_list'] = filtered_items row['multi_id'] = filtered_ids return row # 应用函数到每行 result_df = sample_df.apply(filter_matches, axis=1)
最终输出结果
处理后的result_df内容如下:
| single_proj_name | single_item_list | single_id | multi_proj_name | multi_item_list | multi_id |
|---|---|---|---|---|---|
| ['jsfk'] | ['ABC_123'] | [1234] | ['AAA', 'VVVV', 'SASD'] | ['ABC_123'] | [29481] |
| ['fhjk'] | ['DEF123'] | [5678] | ['QEWWQ', 'SFA', 'JKKK', 'fhjk'] | ['DEF123'] | [57567] |
| ['ERRW'] | ['FAS324'] | [91011] | ['ERRW', 'TTTT'] | ['FAS324'] | [8775] |
| ['SJBAK'] | ['HSJD123'] | [121314] | ['SJBAK', 'YYYY'] | ['HSJD123'] | [43512] |
内容的提问来源于stack exchange,提问作者The Great
相关产品推荐
相关产品推荐

