gpt4 book ai didi

python - 创建一个对关系记录进行计数的对称矩阵

转载 作者:行者123 更新时间:2023-12-03 17:07:09 25 4
gpt4 key购买 nike

我想通过基于另一列(Value)的一列(ID)计算所有可能的成对关系的数量。
示例数据框:

   ID Value
0 1 A
1 1 A
2 1 A
3 1 B
4 1 C
5 2 B
6 2 C
7 2 C
生成示例数据框:
import pandas as pd
df = pd.DataFrame({'ID' : {0: 1, 1: 1, 2: 1, 3: 1, 4: 1,
5: 2, 6: 2, 7: 2},
'Value' : {0: 'A', 1: 'A', 2: 'A', 3: 'B', 4: 'C',
5: 'B', 6: 'C', 7: 'C'}
})
应该对 ID=1ID=2执行成对计数。 ID=1可能成对出现
(A,A), (A,A), (A,B), (A,C),
(A,A), (A,A), (A,B), (A,C),
(A,A), (A,A), (A,B), (A,C),
(B,A), (B,A), (B,A), (B,C),
(C,A), (C,A), (C,A), (C,B),
ID=2可能成对出现
(B,C), (B,C)
(C,B), (C,C)
(C,B), (C,C)
预期的数据帧:
   A  B  C
A 6 3 3
B 3 0 3
C 3 3 2
我目前得到了什么(请参阅以下与其他stackoverflow问题的关系):
df = pd.merge(df, df, on='ID')
df = pd.crosstab(df['Value_x'], df['Value_y']).rename_axis(None).rename_axis(None, axis=1)
print (df)
错误的输出:
   A  B  C
A 9 3 3
B 3 2 3
C 3 3 5
正如您可能会发现的,该问题主要是与乙二醛方面有关。我假设我必须集中精力处理合并方面的问题。但是,到目前为止,我还无法解决:(有什么建议吗?
提前致谢!
相关问题:
that question有很多相似之处。但是,这个问题可能会有一些错误的期望。 (A,A)= 0,(B,B)= 0,(C,C)= 0的情况应为0,因为基于该问题在两种情况(ID = 1或ID = 2)中都不存在。如果我们只想计算该问题的条件> AB,AC,BA,BC,CA,CB(来自ID = 1)和BC,CB(来自ID = 2)。另一方面,这里的主要区别是在对角线一侧。

最佳答案

让我们在dot之后尝试crosstab,然后减去自身对〜

s = pd.crosstab(df.ID,df.Value)
out = s.T.dot(s)
np.fill_diagonal(out.values, out.values.diagonal() - s.sum())
out
Value A B C
Value
A 6 3 3
B 3 0 3
C 3 3 2

关于python - 创建一个对关系记录进行计数的对称矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67255415/

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