You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于DataFrame的COS列动态迭代计算视频加权相似度分数

解决按vid2计算加权平均相似度分数的问题

我来帮你搞定这个问题——你的核心需求是按vid2分组计算fsim的加权平均值(权重为FWeight),原代码的问题在于手动迭代的逻辑绕错了,其实用pandas的分组功能就能轻松实现,完全不需要手动跳行迭代。

先分析原代码的问题

你原来的嵌套循环逻辑存在两个关键错误:

  • iterrows遍历每一行时,嵌套的range(row['COS'])循环只会重复使用当前行的FWeightfsim,根本没取到同组其他行的真实数据
  • 手动修改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

火山引擎 最新活动