【问题标题】:Create sparse indicator matrix for column pairs为列对创建稀疏指标矩阵
【发布时间】:2021-01-20 18:02:28
【问题描述】:

我有一个包含两列的 pandas 数据框。我想为这两列中的对创建一个稀疏指标矩阵(scipy.sparse.csr_matrix 或 cipy.sparse.csc_matrix)。

数据很大,所以不能使用 pandas 函数来加宽形状。我想去和去如下:

发件人:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.array(([1,2], [2,2], [3,6], [3, 5])), columns = ['A', 'B'])
df

    A   B
0   1   2
1   2   2
2   3   6
3   3   5

收件人:

df['ones'] = 1
pivoted = pd.pivot_table(df, index = ['A'], columns = ['B'], values = ['ones'])
pivoted.columns = pivoted.columns.droplevel()
pivoted

B   2   5   6
A           
1   1.0 NaN NaN
2   1.0 NaN NaN
3   NaN 1.0 1.0

这很接近:numpy/scipy build adjacency matrix from weighted edgelist 但我想知道如何使用未加权图(即两列而不是三列)来做到这一点

我一直在谷歌上搜索并使用 numpy 数组来达到目标​​,但现在正式花费了太长时间。任何帮助表示赞赏。

【问题讨论】:

  • 你现在的方法有什么问题?
  • @Quang Hoang - 数据量很大。我需要更有效地创建邻接矩阵。然后我将对邻接矩阵进行一些点积运算,所以 igraph 没有帮助。所以结果需要是稀疏的,而且,我不能使用 pandas 到达那里,否则我会在尝试旋转时耗尽内存。
  • 我认为我需要的是:stackoverflow.com/questions/29146892/… 但我想知道如何使用未加权图(即两列而不是三列)来做到这一点

标签: pandas numpy scipy sparse-matrix


【解决方案1】:

你的意思是:

csc = sparse.csc_matrix((np.ones_like(df['A']), (df['A'],df['B'])))

csc.toarray()

输出:

array([[0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 1]], dtype=int64)

【讨论】:

  • 很好,是的,这会奏效。没有连续 ID 的情况怎么办?即 A = [1,6099877734, 50]。我想稀疏表示无关紧要吗?也就是说,我们实际上并没有创建一个包含 6099877734 行的矩阵。
  • 是的,但是你仍然创建了一个稀疏矩阵,所以它不应该给你带来更多的内存。
猜你喜欢
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 2018-01-19
  • 2011-03-23
相关资源
最近更新 更多