gpt4 book ai didi

python - Pandas - 按位类似并计算加权平均值

转载 作者:行者123 更新时间:2023-12-01 00:51:29 24 4
gpt4 key购买 nike

我有一个 Pandas 数据框df1,如下所示:

  ID  col1 col2 col3
0 A 1 1 1
1 B 1 1 1
2 C 1 0 1
3 D 0 0 0
4 E 1 1 1
5 F 0 1 0
6 G 1 0 0
7 H 0 1 0

和另一个数据帧df2,如下所示:

  ID  col1 col2 col3 rating1  rating2
0 I 0 1 0 1 2
1 J 0 1 1 3 1
2 K 1 0 0 4 4
3 L 0 1 0 2 2

我需要找到 df1 每一行之间的相似度 (x==y).sum (不是按位异或)(除了 ID) 与 df2 中的相应行,并使用该相似度作为权重来计算 df1 中所有 ID 的平均评分。

例如:

A 的最终评级应计算为:

评级1[A] = ( 1*1 + 2*3 + 1*4 + 1*2 )/(1 + 2 + 1 + 1) = 13/5

在使用 df2 计算评分的相似度平均值后,我的输出应该是另一个数据帧,其中包含 df1 中所有 ID 的评分。

输出数据框:

  ID rating1  rating2
0 A 13/5 2
1 B 13/5 2
... and so on till ID H

请帮助我使用 pandas 函数有效地完成此操作。我尝试通过迭代所有行来完成此操作,但是 df1df2 都是非常巨大的表,并且需要花费大量时间。

提前致谢。

<小时/>

更新

@WeNYoBen 的回答是正确的。不过,就我而言,df1df2 的尺寸比我在此处显示的示例要高得多。

在第三行(@WeNYoBen 的答案)中,s 的尺寸将为 len(df1)*len(df2)对我来说它们都很大并且给了我一个 MemoryError 。是否有任何解决方法,从某种意义上说,我可以将 df2 分成更小的部分并可以单独计算它们?

再次感谢。

最佳答案

这更像是 numpy 广播,然后是 dot

s1=df1.iloc[:,1:].values
s2=df2.iloc[:,1:-2].values
s=np.sum(s1[:,None]==s2,-1)
df1['rating1']=s.dot(df2.rating1)/s.sum(1)
df1['rating2']=s.dot(df2.rating2)/s.sum(1)
df1
Out[623]:
ID col1 col2 col3 rating1 rating2
0 A 1 1 1 2.600000 2.000000
1 B 1 1 1 2.600000 2.000000
2 C 1 0 1 3.666667 3.000000
3 D 0 0 0 2.428571 2.428571
4 E 1 1 1 2.600000 2.000000
5 F 0 1 0 2.111111 2.000000
6 G 1 0 0 3.000000 3.200000
7 H 0 1 0 2.111111 2.000000

关于python - Pandas - 按位类似并计算加权平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56535395/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com