我有一个这样的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
,我需要找到(x==y).sum
的每一行(df1
除外)与ID
中的相应行之间的相似性df2
(不是逐位异或),并使用相似度作为权重,以计算df1
中所有ID的平均评分。
例如:
A的最终评级应计算为:
rating1[A] = ( 1*1 + 2*3 + 1*4 + 1*2 ) / (1 + 2 + 1 + 1) = 13/5
我的输出应该是另一个数据帧,该数据帧在使用df1
计算等级的相似度平均值之后,具有df2
中所有ID的等级。
输出数据框:
ID rating1 rating2
0 A 13/5 2
1 B 13/5 2
... and so on till ID H
请使用熊猫函数帮助我有效地做到这一点。我尝试通过遍历所有行来做到这一点,但是df1
和df2
都是非常大的表,并且要花很多时间。
谢谢。
@WeNYoBen的回答是正确的。尽管以我为例,df1
和df2
的尺寸比我在此显示的示例高得多。
在第三行(@WeNYoBen的答案)中,s
的尺寸为len({df1
)* len(df2
),在我看来,这两个尺寸都很大给我一个MemoryError从某种意义上说,我可以将df2
拆分成较小的部分并可以分别进行计算吗?
再次感谢。
答案 0 :(得分:1)
这更像是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