Добавить массив numpy в виде столбца в кадр данных Pandas
У меня есть объект фрейма данных Pandas формы (X, Y), который выглядит следующим образом:
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
и многократной разреженной матрицы (CSC) формы (X, Z), которая выглядит примерно так:
[[0, 1, 0],
[0, 0, 1],
[1, 0, 0]]
Как я могу добавить содержимое из матрицы в кадр данных в новом столбце с именем, так что кадр данных будет выглядеть следующим образом:
[[1, 2, 3, [0, 1, 0]],
[4, 5, 6, [0, 0, 1]],
[7, 8, 9, [1, 0, 0]]]
Обратите внимание, что кадр данных теперь имеет форму (X, Y + 1), а строки из матрицы - это элементы в кадре данных.
Ответы
Ответ 1
import numpy as np
import pandas as pd
import scipy.sparse as sparse
df = pd.DataFrame(np.arange(1,10).reshape(3,3))
arr = sparse.coo_matrix(([1,1,1], ([0,1,2], [1,2,0])), shape=(3,3))
df['newcol'] = arr.toarray().tolist()
print(df)
дает
0 1 2 newcol
0 1 2 3 [0, 1, 0]
1 4 5 6 [0, 0, 1]
2 7 8 9 [1, 0, 0]
Ответ 2
Рассмотрим использование более высокой размерной структуры данных (a Panel) вместо хранения массива в вашем столбце:
In [11]: p = pd.Panel({'df': df, 'csc': csc})
In [12]: p.df
Out[12]:
0 1 2
0 1 2 3
1 4 5 6
2 7 8 9
In [13]: p.csc
Out[13]:
0 1 2
0 0 1 0
1 0 0 1
2 1 0 0
Посмотрите поперечные сечения и т.д. и т.д. и т.д.
In [14]: p.xs(0)
Out[14]:
csc df
0 0 1
1 1 2
2 0 3
Подробнее см. в документах для панелей.