Pandas:如何根据另一个数据框的值对数据框中的列进行求和

3

我是Pandas的新手,正在尝试做以下事情:

  • 我有一个名为comms的数据帧,其中包括列articleID和commentScore等。
  • 我还有另一个名为arts的数据帧,其中只包括列articleID。

我需要在arts中创建一个名为articleScore的新列。每篇文章必须具有该文章的文章得分,该得分是与该文章相关的所有评论分数之和(具有相同articleID),再除以sqrt(n_comms + 1),其中n_comms是具有该特定ID的评论数。

我已经成功实现了这一点,但效率非常低(如下所示)。

for article in arts:
    n, tempScore = 0
    
    for i, value in comms.iterrows():
        if value['articleID'] == article['articleID']:
            tempScore + = value['commentScore']
            n += 1    
    article['articleScore'] /= math.sqrt(n+1)

编辑:以下是我希望发生的示例:

comms:
__________________________
| # | artID | commScore  |
| 0 | 1x5w  |     2      |
| 1 | 77k3  |     1      |
| 2 | 77k3  |    -1      |
| 3 | 3612  |     5      |
| 4 | 1x5w  |     3      |
--------------------------

arts:
___________________________
| # | artID | artScore (?) |
| 0 | 1x5w  |    2.89      |
| 1 | 77k3  |     0        |
| 2 | 3612  |    3.54      |
-------------------------

我需要(创建并)填写artScore列。每个artScore是评论分数的总和,但仅限于文章具有相同artID的评论,除以sqrt(n+1)。
谁能帮帮我?非常感谢!
Andrea

1
你能否添加一个示例数据框和你期望的数据框呢? - dibery
你所说的“预期数据框”是什么意思? - Sala
你希望在给定样本输入的情况下得到的结果。因为这是一个样本,你可以手动填写结果。这样,人们可以更好地帮助你。 - dibery
谢谢,我已经添加了那个。希望现在有人可以帮忙! - Sala
我已经完成了,谢谢。 - Sala
显示剩余2条评论
3个回答

1
你可以使用groupbyagg和自定义的lambda函数来应用于每个组:
comms.groupby('artID').agg(
    {'commScore': lambda x: x.sum() / np.sqrt(len(x) + 1)}
).reset_index().rename(columns={'commScore': 'artScore'})

结果:

  artID  artScore
0  1x5w  2.886751
1  3612  3.535534
2  77k3  0.000000

1
我认为您可以使用 groupby ,然后在'artID'上进行合并:
grpd = comms.groupby('artID')
to_merge = grpd.sum().divide(np.sqrt(grpd.count()+1)).reset_index().rename(columns={'commScore': 'artScore'})[['artID', 'artScore']]
arts.merge(to_merge, on='artID')

嗨@gofvonx,感谢您的回答。我按照您的建议做了,但现在我的arts数据框中有很多不需要的列。此外,在您的代码片段中,我没有看到您给新列articleScore分配名称的地方。 - Sala
@Sala 我已经包含了列的显式重命名,并且只选择了需要合并的子框架。(你的样本数据没有任何额外的列。) 这样可以吗? - gofvonx
是的。非常感谢! - Sala

1
#article count and sum
df = df.groupby('artID').agg(['sum', 'count'])

#create new column and utilize your formula
df['artScore'] = df['commScore']['sum'] / math.sqrt(df['commScore']['count']+1)


    commScore   artScore
       sum  count   
artID           
1x5w    5   2   5.0
3612    5   1   5.0
77k3    0   2   0.0

我认为这段代码不正确,因为它没有取平方根。 - gofvonx
你是对的。我已经修复了。谢谢。@gofvonx - tyasird

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接