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 函数高效地完成此操作。我尝试通过遍历所有行来做到这一点,但是 df1
和 df2
都是非常大的表,需要花费很多时间。
提前致谢。
更新
@WeNYoBen 的回答是正确的。虽然,就我而言,df1
和 df2
的维度比我在此处作为示例显示的维度高得多。
在第三行(@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
我有一个 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
.
例如:
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 函数高效地完成此操作。我尝试通过遍历所有行来做到这一点,但是 df1
和 df2
都是非常大的表,需要花费很多时间。
提前致谢。
更新
@WeNYoBen 的回答是正确的。虽然,就我而言,df1
和 df2
的维度比我在此处作为示例显示的维度高得多。
在第三行(@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