问题
我有一个pandas数据帧,我需要计算数据帧中每个唯一条目出现在每个其他条目的同一行中的行数。
相关但不同的帖子
- Python中单词列表中的共现矩阵:与我的问题类似,但不是从数据帧开始的。大多数答案使用迭代。我希望潘达斯有更好的解决方案
- 构建蟒蛇熊猫共现矩阵:这已经从一个数据帧开始了,其中正文中只有0和1(我想代表的是实际值?(,但没有实际值
- 将两列数据帧转换为熊猫中的出现矩阵:这篇文章假设只有两列,这对于这里讨论的情况来说是相当有限的
可再现设置
import pandas as pd
import numpy as np
数据帧:
df = pd.DataFrame({'a': ['A', 'A', 'B', 'B'],
'b': ['B', 'C', 'B', 'B'],
'c': ['C', 'A', 'C', 'A'],
'd': ['B', 'D', 'B', 'A']},
index=[0, 1, 2, 3])
即:
+----+-----+-----+-----+-----+
| | a | b | c | d |
|----+-----+-----+-----+-----|
| 0 | A | B | C | B |
| 1 | A | C | A | D |
| 2 | B | B | C | B |
| 3 | B | B | A | A |
+----+-----+-----+-----+-----+
(使用此打印。(
我尝试了什么
我试着使用答案中的代码,&替换这些变量:
document = [list(each) for each in df.values]
names = list(np.unique(df.values))
它给出了错误的结果:
A B C D
A 4 6 3 2
B 6 10 5 0
C 3 5 0 1
D 2 0 1 0
它是基于迭代的,所以我希望有更好的解决方案。
预期输出
+----+-----+-----+-----+-----+
| | A | B | C | D |
|----+-----+-----+-----+-----|
| A | nan | 2 | 2 | 1 |
| B | 2 | nan | 2 | 0 |
| C | 2 | 2 | nan | 1 |
| D | 1 | 0 | 1 | nan |
+----+-----+-----+-----+-----+
存在CCD_ 1行,其中CCD_;B
同时出现,因此单元格行A
列B
中的值为2
。存在CCD_ 7行,其中CCD_;C
同时出现,因此单元格行2
0列C
中的值为2
。
问题
如何在Pandas中轻松获得此逐行共现矩阵如果我不必遍历这些值,那就太好了。
(pandas.Categorical可能有一些用处,我还没能让它工作。(
我们可以先执行stack
,然后执行get_dummies
和dot
,然后值
s=df.stack().str.get_dummies().sum(level=0).ne(0).astype(int)
s=s.T.dot(s).astype(float)
np.fill_diagonal(s.values, np.nan)
s
Out[33]:
A B C D
A NaN 2.0 2.0 1.0
B 2.0 NaN 2.0 0.0
C 2.0 2.0 NaN 1.0
D 1.0 0.0 1.0 NaN