【问题标题】:Cooccurence matrix from pandas dataframe来自熊猫数据框的共现矩阵
【发布时间】:2020-12-15 07:33:45
【问题描述】:

问题

我有一个 pandas 数据框,我需要计算数据框中每个唯一条目出现在每个其他条目的同一行中的行数。


相关但不同的帖子


可重复设置

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   |
+----+-----+-----+-----+-----+

(使用this打印。)


我尝试过的

我尝试使用code from answer,并替换这些变量:

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 |
+----+-----+-----+-----+-----+

2 行同时出现AB,因此单元格行AB 中的值为2。 有2AC都出现了,所以单元格行AC的值为2


问题

如何在 Pandas 中轻松获得此逐行共现矩阵?如果我不必遍历这些值,那就太好了。


pandas.Categorical 可能有点用,我还没有成功。)

【问题讨论】:

  • 你有两行包含AC :-)
  • 哦,是的,没错!已更正! :)(对不起)

标签: python python-3.x pandas dataframe


【解决方案1】:

我们可以先stack 然后get_dummiesdot 然后值

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

【讨论】:

    猜你喜欢
    • 2019-07-09
    • 2017-04-11
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多