熊猫-类似地按位计算,并据此计算加权平均值

时间:2019-06-11 01:43:08

标签: python pandas dataframe vector matrix-multiplication

我有一个这样的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

请使用熊猫函数帮助我有效地做到这一点。我尝试通过遍历所有行来做到这一点,但是df1df2都是非常大的表,并且要花很多时间。

谢谢。


更新

@WeNYoBen的回答是正确的。尽管以我为例,df1df2的尺寸比我在此显示的示例高得多。

在第三行(@WeNYoBen的答案)中,s的尺寸为len({df1)* len(df2),在我看来,这两个尺寸都很大给我一个MemoryError从某种意义上说,我可以将df2拆分成较小的部分并可以分别进行计算吗?

再次感谢。

1 个答案:

答案 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