You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas:过滤DataFrame列中嵌套列表值并匹配对应ID

处理嵌套列表的DataFrame匹配与过滤问题

问题背景

给定包含嵌套列表的DataFrame,需要完成以下操作:

  • 提取每行single_item_list中的目标值
  • 在multi_item_list中递归搜索该目标值(支持任意多层嵌套)
  • 仅保留multi_item_list中的匹配项及对应层级结构
  • 根据匹配项的位置,同步保留multi_id中的对应值

原始代码无法处理嵌套列表场景,以下是完整解决方案。

原始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'],['ABC_123','ADC_123']],['XYZAV','DEF123','ABC_123','SAJKF'],['QWER12','FAS324'],['JFAJKA','HSJD123']],
    'multi_id':[[[2167,2147,29481],[5432,1234]],[2313,57567,2321,7898],[1123,8775],[5237,43512]]
})

解决方案

1. 递归匹配过滤函数

编写递归函数遍历嵌套列表,同步处理multi_item_list和multi_id,仅保留匹配项及对应ID:

def filter_nested_lists(target_item, item_list, id_list):
    filtered_items = []
    filtered_ids = []
    
    for item, id_val in zip(item_list, id_list):
        if isinstance(item, list):
            # 递归处理嵌套子列表,仅保留有匹配项的子结构
            sub_items, sub_ids = filter_nested_lists(target_item, item, id_val)
            if sub_items:
                filtered_items.append(sub_items)
                filtered_ids.append(sub_ids)
        else:
            # 非列表元素直接匹配
            if item == target_item:
                filtered_items.append(item)
                filtered_ids.append(id_val)
    
    return filtered_items, filtered_ids

2. 应用到DataFrame每行

使用apply方法逐行处理,生成过滤后的结果列:

def process_row(row):
    target = row['single_item_list'][0]
    filtered_items, filtered_ids = filter_nested_lists(target, row['multi_item_list'], row['multi_id'])
    return pd.Series({
        **row.to_dict(),
        'filtered_multi_item': filtered_items,
        'filtered_multi_id': filtered_ids
    })

# 生成结果DataFrame
result_df = sample_df.apply(process_row, axis=1)

3. 验证结果

查看过滤后的关键列:

print(result_df[['filtered_multi_item', 'filtered_multi_id']])

输出:

filtered_multi_item          filtered_multi_id
0  [[ABC_123], [ABC_123]]  [[29481], [1234]]
1                [DEF123]                [57567]
2                [FAS324]                [8775]
3               [HSJD123]               [43512]

该方案支持任意多层嵌套列表的匹配,完全满足需求。

内容的提问来源于stack exchange,提问作者The Great

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:45:25