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

如何基于多条件从嵌套DataFrame中匹配获取Value值?

高效匹配嵌套DataFrame获取对应值的解决方案

问题背景

我有两个DataFrame:

  • data_A是常规结构的DataFrame
  • data_B是嵌套DataFrame,其data C列包含子DataFrame(如data_C1、data_C2),且data_B的Column 1值唯一,可作为查找表使用

数据示例

import pandas as pd

# 定义子DataFrame
data_C1 = pd.DataFrame({'Limit': [20,30], 'Value': [0.2, 0.3]})
data_C2 = pd.DataFrame({'Limit': [20,30], 'Value': [0.3, 0.4]})

# 构建主DataFrame
data_A = pd.DataFrame({
    'Column 1': [2, 2, 3],
    'Column 2': ['A', 'B', 'C'],
    'Column 3': [20, 30, 30]
})
data_B = pd.DataFrame({
    'Column 1': [2, 3],
    'data C': [data_C1, data_C2]
})

需求说明

遍历data_A的每一行,完成两步匹配:

  1. 通过data_A['Column 1']匹配data_B['Column 1'],获取对应的data C子DataFrame
  2. 用data_A['Column 3']匹配子DataFrame的Limit列,将对应的Value字段添加到data_A中

最终需要满足:当data_A['Column 1']=data_B['Column 1']且data_A['Column 3']=data_C['Limit']时,取出对应Value。

预期输出

Column 1Column 2Column 3Value
2A200.2
2B300.3
3C300.4

高效解决方案(无需merge)

核心思路:构建双层映射字典

先将data_B转换为**Column 1值 → Limit值: Value值**的双层字典,之后直接通过data_A的两列值做O(1)查找,避免merge的复杂操作,效率更高。

# 构建双层查找字典
lookup_dict = {}
for _, row in data_B.iterrows():
    col1_val = row['Column 1']
    # 将子DataFrame转换为Limit到Value的映射字典
    limit_value_map = row['data C'].set_index('Limit')['Value'].to_dict()
    lookup_dict[col1_val] = limit_value_map

# 为data_A添加Value列
data_A['Value'] = data_A.apply(lambda x: lookup_dict[x['Column 1']][x['Column 3']], axis=1)

# 查看结果
print(data_A)

方案优势

  • 效率更高:提前构建映射字典,后续查找是O(1)操作,比merge的join开销小,数据量越大优势越明显
  • 逻辑直观:代码结构清晰,没有merge的参数复杂度,可读性强
  • 无额外数据冗余:不会产生merge可能带来的中间数据膨胀问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 02:43:28