Скрипучая разреженная матрица - PullRequest
0 голосов
/ 08 января 2019

У меня есть фрейм данных с миллионами строк, и я хотел бы хранить все данные в разреженных матрицах для предотвращения проблем с памятью.

id     value     count
002    groupB      1
001    groupB      3
001    groupC      1
003    groupC      2
002    groupA      1
004    groupZ      1
 ...

df.groupby(['id', 'value'])['count'].sum()

id  value 
1   groupB    3
    groupC    1
2   groupA    1
    groupB    1
3   groupC    2
4   groupZ    1
Name: count, dtype: int64

Я пытаюсь использовать результат суммирования по группам в разреженную матрицу. Имя моего предопределенного заголовка / столбца в массиве columns_names. Я посмотрел csc_matrix и csr_matrix, но понятия не имею, как перевести результат groupby в разреженный.

Моя конечная цель - создать такой фрейм данных с предопределенными именами столбцов (не обязательно в алфавитном порядке):

id   groupA    groupB    groupC    groupD   groupE  ..  groupZ   groupAA    ...
001    0         3         1         0        0           0        0
002    1         1         0         0        0           0        0
003    0         0         2         0        0           0        0 
004    0         0         0         0        0           1        0
  ...

1 Ответ

0 голосов
/ 08 января 2019

В pandas 0.23 есть структура данных SparseSeries , которую можно использовать для получения разреженной матрицы:

s = df.groupby(['id', 'value'])['count'].sum()

ss = s.to_sparse()  # convert to sparse series
coo, rows, columns = ss.to_coo(row_levels=['id'], column_levels=['value'], sort_labels=True)  # convert to coo
result = coo.tocsr()  # convert to csr

print(result)

выход

  (0, 1)    3
  (0, 2)    1
  (1, 0)    1
  (1, 1)    1
  (2, 2)    2
  (3, 3)    1

Сначала вы преобразуете его в редкий ряд, затем в coo (см. to_coo ) и, наконец, при необходимости, в csr. Переменные строки и столбцы содержат метки строк и столбцов из мультииндекса. Для приведенного выше примера метки столбцов:

['groupA', 'groupB', 'groupC', 'groupZ']

и метки строк:

[1, 2, 3, 4]
...