基于DataFrame的COS列动态迭代计算视频加权相似度分数
解决按
vid2计算加权平均相似度分数的问题 我来帮你搞定这个问题——你的核心需求是按vid2分组计算fsim的加权平均值(权重为FWeight),原代码的问题在于手动迭代的逻辑绕错了,其实用pandas的分组功能就能轻松实现,完全不需要手动跳行迭代。
先分析原代码的问题
你原来的嵌套循环逻辑存在两个关键错误:
- 在
iterrows遍历每一行时,嵌套的range(row['COS'])循环只会重复使用当前行的FWeight和fsim,根本没取到同组其他行的真实数据 - 手动修改
i = i + row['COS']在iterrows里完全无效,因为iterrows是按固定顺序遍历每一行,不会因为你修改变量i就跳过后续行
正确的解决方案:利用Pandas分组功能
你的需求本质是对每个vid2分组,计算加权平均相似度 = 组内所有行的(fsim * FWeight)之和 / 组内所有行的FWeight之和,而COS其实就是每个vid2对应的行数,groupby会自动帮你把同vid2的所有行归为一组,完全不需要用它来控制迭代。
直接看代码实现:
import pandas as pd # 先还原你的示例DataFrame(如果已有merged可以跳过这部分) merged = pd.DataFrame({ 'vid2': ['-_aaMGK6GGw_57_61', '-_aaMGK6GGw_57_61', '-_hbPLsZvvo_5_8', '-_hbPLsZvvo_5_8', '-_hbPLsZvvo_18_25'], 'COS': [2, 2, 2, 2, 1], 'fsim': [0.253792, 0.192565, 0.562707, 0.179969, 0.275962], 'FWeight': [0.75, 0.25, 0.333333, 0.666667, 0.714286] }) # 定义加权平均计算函数 def calculate_weighted_avg(group): weighted_sum = (group['fsim'] * group['FWeight']).sum() total_weight = group['FWeight'].sum() return weighted_sum / total_weight # 按vid2分组计算,得到带vid2和对应分数的DataFrame video_scores_df = merged.groupby('vid2').apply(calculate_weighted_avg).reset_index(name='vid_score') # 如果只需要分数列表,直接转成list即可 video_scores_list = video_scores_df['vid_score'].tolist() print("带vid2的计算结果:") print(video_scores_df) print("\n仅分数列表:") print(video_scores_list)
验证结果
运行后,-_aaMGK6GGw_57_61的计算结果为0.23848525,和你预期的0.238485完全一致;其他组的结果也会自动正确计算,不管COS是1、2还是其他数值,都能动态适配。
内容的提问来源于stack exchange,提问作者Vaidehi




