两个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
相关产品推荐
相关产品推荐

