如何基于多条件从嵌套DataFrame中匹配获取Value值?
高效匹配嵌套DataFrame获取对应值的解决方案
问题背景
我有两个DataFrame:
data_A是常规结构的DataFramedata_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的每一行,完成两步匹配:
- 通过
data_A['Column 1']匹配data_B['Column 1'],获取对应的data C子DataFrame - 用
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 1 | Column 2 | Column 3 | Value |
|---|---|---|---|
| 2 | A | 20 | 0.2 |
| 2 | B | 30 | 0.3 |
| 3 | C | 30 | 0.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
相关产品推荐
相关产品推荐

