【问题标题】:how to loop a dataframe with increment factor based on a particular column value如何根据特定列值循环具有增量因子的数据帧
【发布时间】:2020-05-09 20:20:41
【问题描述】:

我正在使用的数据框如下所示:

                vid2  COS      fsim   FWeight
0  -_aaMGK6GGw_57_61    2  0.253792  0.750000
1  -_aaMGK6GGw_57_61    2  0.192565  0.250000
2    -_hbPLsZvvo_5_8    2  0.562707  0.333333
3    -_hbPLsZvvo_5_8    2  0.179969  0.666667
4  -_hbPLsZvvo_18_25    1  0.275962  0.714286

这里, 这些特征的含义如下:

FWeight - 每个片段(或行)的权重

fsim - cap1cap2

两列之间的相似度得分

加权公式为:

For example, 
For vid2 "-_aaMGK6GGw_57_61", COS = 2
Thus, the two rows with vid2 comes under this.

   fsim       FWeight
0  0.253792   0.750000
1  0.192565   0.250000

The calculated value vid_score needs to be 
vid_score(1st video) = (fsim[0] * FWeight[0] + fsim[1] * FWeight[1])/(FWeight[0] + FWeight[1])

The expected output value vid_score for vid2 = -_aaMGK6GGw_57_61 is 
(0.750000) * (0.253792) + (0.250000) * (0.192565) 
= 0.238485 (Final value)

对于某些视频,此 COS = 1, 2, 3, 4, 5, ... 因此这需要是动态的

我正在尝试计算此处为 vid2 的每个视频 ID 的加权相似度得分。但是,每个视频分别有许多字幕和权重。它各不相同,有的有 2 个,有的有 1 个,有的有 3 个,等等。这些片段和字幕的数量已存储在特征 COS 中(即片段数)。

我想遍历数据帧,其中每个视频的分数存储为 fsim(片段相似度分数)的加权平均分数。但迭代次数不规律。

我已经尝试过这段代码。但我无法动态迭代迭代因子为 COS 而不仅仅是一个常数值

vems_score = 0.0

video_scores = []

for i, row in merged.iterrows():
    vid_score = 0.0
    total_weight = 0.0

    for j in range(row['COS']):
        total_weight = total_weight + row['FWeight']
        vid_score = vid_score + (row['FWeight'] * row['fsim'])

    i = i + row['COS']

    vid_score = vid_score/total_weight
    video_scores.append(vid_score)

print(video_scores)

【问题讨论】:

  • 您的加权相似度得分的公式是什么?
  • 创建一个两/三列的虚拟数据框,其中只有 COS、FWeight、fsim 等列,并保留大约 5 行。使用此示例数据来解释您的期望。还提供虚拟数据帧的预期输出。您当前的数据不可重现且难以阅读。请尽量减少不必要的细节。
  • @CypherX 我已经编辑了数据。请看一下。如果在理解我的问题时有问题,我会进一步修改。谢谢
  • 那么你最终的结果会是什么样子?您是否将 vid2 作为后处理中每一行的唯一值?
  • @CypherX,是的,一个带有 vid2 及其分数 vid_score 的列表或数据框

标签: python pandas dataframe


【解决方案1】:

这是我的解决方案,您可以根据自己的需要进行修改/优化。

import pandas as pd, numpy as np
def computeSim():    
    vid=[1,1,2,2,3]
    cos=[2,2,2,2,1]
    fsim=[0.25,.19,.56,.17,.27]
    weight = [.75,.25,.33,.66,.71]
    df= pd.DataFrame({'vid':vid,'cos':cos,'fsim':fsim,'fw':weight})
    print(df)
    df2 = df.groupby('vid')
    similarity=[]
    for group in df2:
        similarity.append( np.sum(group[1]['fsim']*group[1]['fw'])/ np.sum(group[1]['fw']))
    return similarity

输出:

0.235

0.30000000000000004

0.27

【讨论】:

    【解决方案2】:

    解决方案

    用你的数据试试这个。我假设您将数据框存储为df

    df['Prod'] = df['fsim']*df['FWeight']
    grp = df.groupby(['vid2', 'COS'])
    result = grp['Prod'].sum()/grp['FWeight'].sum()
    print(result)
    

    输出您的数据:虚拟数据 (B)

    vid2               COS
    -_aaMGK6GGw_57_61  2      0.238485
    -_hbPLsZvvo_18_25  1      0.275962
    -_hbPLsZvvo_5_8    2      0.307548
    dtype: float64
    

    虚拟数据:A

    我制作了以下虚拟数据来测试逻辑的几个方面。

    df = pd.DataFrame({'vid2': [1,1,2,5,2,6,7,4,8,7,6,2], 
                       'COS': [2,2,3,1,3,2,2,1,1,2,2,3], 
                       'fsim': np.random.rand(12), 
                       'FWeight': np.random.rand(12)})
    df['Prod'] = df['fsim']*df['FWeight']
    print(df)
    
    # Groupby and apply formula
    grp = df.groupby(['vid2', 'COS'])
    result = grp['Prod'].sum()/grp['FWeight'].sum()
    print(result)
    

    输出

    vid2  COS
    1     2      0.405734
    2     3      0.535873
    4     1      0.534456
    5     1      0.346937
    6     2      0.369810
    7     2      0.479250
    8     1      0.065854
    dtype: float64
    

    虚拟数据:B(提供OP)

    这是您的虚拟数据。我制作了这个脚本,以便任何人都可以轻松运行它并将数据加载为数据框。

    import pandas as pd
    from io import StringIO
    s = """
                    vid2  COS      fsim   FWeight
    0  -_aaMGK6GGw_57_61    2  0.253792  0.750000
    1  -_aaMGK6GGw_57_61    2  0.192565  0.250000
    2    -_hbPLsZvvo_5_8    2  0.562707  0.333333
    3    -_hbPLsZvvo_5_8    2  0.179969  0.666667
    4  -_hbPLsZvvo_18_25    1  0.275962  0.714286
    """
    df = pd.read_csv(StringIO(s), sep='\s+')
    #print(df)
    

    【讨论】:

    • @Vaidehi 请看一下解决方案,如果您有任何问题,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2021-04-27
    • 2019-12-28
    • 2022-01-18
    • 2019-08-28
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多