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

两个DataFrame列映射:基于Item列表的权重求和实现需求

如何基于两个DataFrame计算每个ID对应的Item权重总和?

我来帮你搞定这个需求!咱们先明确下要做的事:你有两个DataFrame,df1里每条记录的ITEMS列是一组包含itemid的元组,需要用df2中对应itemid的WEIGHT值,算出每个ID下所有item的权重总和。

先还原示例数据

首先咱们把你给出的示例数据用Pandas创建出来,方便后续测试:

import pandas as pd

# 创建df1
df1 = pd.DataFrame({
    'ID': [11, 22, 33, 44],
    'ITEMS': [
        [(123, 2.12, 3), (234, 1.2, 3)],
        [(567, 2.3, 3), (245, 1.9, 3)],
        [(999, 4.5, 3), (222, 2.0, 3)],
        [(223, 2.34, 3), (234, 3.5, 3)]
    ]
})

# 创建df2
df2 = pd.DataFrame({
    'ITEMS': [123, 234, 567, 245, 999, 222, 223],
    'WEIGHT': [2.5, 1.8, 19, 3, 2, 2.9, 4.2]
})

解决步骤

1. 把df2转换成权重映射字典

为了快速查找每个itemid对应的权重,咱们把df2转换成字典,这样查询效率会比每次在DataFrame里搜索高很多:

# 构建itemid到weight的映射字典
item_weight_map = df2.set_index('ITEMS')['WEIGHT'].to_dict()

2. 定义计算权重总和的函数

接下来写一个函数,用来处理df1中ITEMS列的每个列表,遍历里面的元组,取出itemid并累加对应的权重:

def calculate_total_weight(items_list):
    total_weight = 0
    for item_tuple in items_list:
        # 取出元组中的第一个元素(itemid)
        item_id = item_tuple[0]
        # 从字典中获取权重,若itemid不存在则默认加0(可根据需求调整)
        total_weight += item_weight_map.get(item_id, 0)
    return total_weight

3. 应用函数生成结果列

最后用apply方法把函数应用到df1的ITEMS列上,生成新的权重总和列:

# 添加新列存储权重总和
df1['TOTAL_WEIGHT'] = df1['ITEMS'].apply(calculate_total_weight)

# 查看结果
print(df1[['ID', 'TOTAL_WEIGHT']])

最终输出

运行上面的代码后,你会得到如下结果:

ID  TOTAL_WEIGHT
0  11           4.3
1  22          22.0
2  33           4.9
3  44           6.0

解释一下结果的计算逻辑:

  • ID=11:123的权重2.5 + 234的权重1.8 = 4.3
  • ID=22:567的权重19 + 245的权重3 = 22.0
  • ID=33:999的权重2 + 222的权重2.9 = 4.9
  • ID=44:223的权重4.2 + 234的权重1.8 = 6.0

如果你的数据量很大,这个方法的效率也不错,因为字典查询是O(1)的时间复杂度,比每次在df2中用loc查找要高效得多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:25:44