python - 如何在python中创建有效的共现?
问题描述
我正在尝试在 python 中创建一个共现矩阵,但正在寻找一些有效的方法来做到这一点。
我的数据集如下所示:
total_labels = ['a','b','c','d']
occ = [['a','b'],['c','d'],['a','c'],['d'],['a','c','d']]
我期待这样的输出:
data_mat = [[0, 1 , 2, 1],
[1, 0, 0, 0],
[2, 0, 0, 2],
[1, 0, 2, 0]]
这实际上是:
a b c d
data_mat = a [[0, 1 , 2, 1],
b [1, 0, 0, 0],
c [2, 0, 0, 2],
d [1, 0, 2, 0]]
我尝试过的是:
import numpy as np
m_matrix = np.zeros([4,4])
for m in range(len(total_labels)):
for j in range(len(total_labels)):
for k in occ:
if set((total_labels[m],total_labels[j])).issubset(set(k)):
m_matrix[m,j]+=1
这是给:
array([[3., 1., 2., 1.],
[1., 1., 0., 0.],
[2., 0., 3., 2.],
[1., 0., 2., 3.]])
但是正如您所看到的, (a,a) 和 (b,b) 等( self loops )之间没有联系,但它在那里给出了值。
如何在不使用许多循环的情况下创建 data_mat?
解决方案
自merge
跟随crosstab
import pandas as pd
df = pd.DataFrame(occ).stack().rename('val').reset_index().drop(columns='level_1')
df = df.merge(df, on='level_0').query('val_x != val_y')
pd.crosstab(df.val_x, df.val_y)
输出:
val_y a b c d
val_x
a 0 1 2 1
b 1 0 0 0
c 2 0 0 2
d 1 0 2 0
如果只需要您提供的那些标签,则可以:
(pd.crosstab(df.val_x, df.val_y)
.reindex(total_labels, axis=0).reindex(total_labels, axis=1))
或者在合并之前过滤(可能更聪明):
df = df.loc[df.val.isin(total_labels)]
推荐阅读
- mysql - MySQL INSERT INTO 语句生成“错误代码:1136。列计数与行的值计数不匹配”
- groovy - Groovy:我可以将断言与 elvis 运算符结合使用吗?
- java - 如何在调用存储过程之前刷新 Spring Data JPA?
- json - 使用 Angular2 将 Angular 模型对象数组中的一个元素替换为另一个对象
- json - 在 azure FAILED、JSON/ARM 模板问题上部署 Cloudera 集群
- c# - 如何同时移动两个枚举数?
- javascript - Ajax JQuery 和折叠插件
- php - how to log only successfully executed query in yii2 similar like profile log
- vba - 如何自动保存附件并覆盖?
- css - 网页视图顶部的顶部栏,但移动底部而不是顶部