Pandas - 类似地按位取值并据此计算加权平均值

Pandas - Take bitwise similarly and calculate weighted mean based on that

我有一个 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 的每一行(ID 除外)与 df2 中相应行之间的相似性 (x==y).sum(不是按位异或)并使用该相似性作为权重来计算 df1.

中所有 ID 的平均评分

例如:

A 的最终评分应计算为:

rating1[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