Как сделать полную матрицу из плотного pandas кадра данных - PullRequest
3 голосов
/ 24 января 2020

У меня есть pandas df в виде:

   A  B    C
0  2  1  428
1  4  3   14
2  5  5  177

I w * sh, чтобы иметь массив, где A - строки, столбцы B и значения C - сложная часть массив должен быть полным, в смысле индексов, так:

[[  0.   0.   0.   0.   0.]
 [428.   0.   0.   0.   0.]
 [  0.   0.   0.   0.   0.]
 [  0.   0.  14.   0.   0.]
 [  0.   0.   0.   0. 177.]]

, а остальные места заполнены нулями. Я могу сделать это с помощью ряда циклов for, но есть ли разумный способ сделать это?

Ответы [ 3 ]

3 голосов
/ 24 января 2020

Использовать DataFrame.pivot с DataFrame.reindex:

s = df['A'].append(df['B'])
r = range(s.min(),s.max()+1)
#r = range(1,6) if you want select a specific range
new_df =( df.pivot(index = 'A',columns = 'B',values = 'C')
           #.pivot(*df) #or this
            .reindex(index = r,columns = r)
            .fillna(0)
            .rename_axis(columns = None,index = None) )

print(new_df)
       1    2     3    4      5
1    0.0  0.0   0.0  0.0    0.0
2  428.0  0.0   0.0  0.0    0.0
3    0.0  0.0   0.0  0.0    0.0
4    0.0  0.0  14.0  0.0    0.0
5    0.0  0.0   0.0  0.0  177.0

Получить массив

new_df.to_numpy()
#new_df.values
array([[  0.,   0.,   0.,   0.,   0.],
       [428.,   0.,   0.,   0.,   0.],
       [  0.,   0.,   0.,   0.,   0.],
       [  0.,   0.,  14.,   0.,   0.],
       [  0.,   0.,   0.,   0., 177.]])
2 голосов
/ 24 января 2020

Вы можете использовать метод put в numpy:

arr = np.zeros((df['A'].max(), df['B'].max()))

idx = (df['A'] - 1) * df['B'].max() + (df['B'] - 1)
arr.put(idx, df['C'])

Вывод:

[[  0.   0.   0.   0.   0.]
 [428.   0.   0.   0.   0.]
 [  0.   0.   0.   0.   0.]
 [  0.   0.  14.   0.   0.]
 [  0.   0.   0.   0. 177.]]

Если вам нужна матрица, где индексы начинаются с нуля:

arr = np.zeros((df['A'].max() + 1, df['B'].max() +1 ))

idx = df['A'] * (df['A'].max() + 1) + df['B']
arr.put(idx, df['C'])

Вывод:

[[  0.   0.   0.   0.   0.   0.]
 [  0.   0.   0.   0.   0.   0.]
 [  0. 428.   0.   0.   0.   0.]
 [  0.   0.   0.   0.   0.   0.]
 [  0.   0.   0.  14.   0.   0.]
 [  0.   0.   0.   0.   0. 177.]]
1 голос
/ 24 января 2020

Я нашел еще один способ решить эту проблему:

from scipy import sparse

sparse.coo_matrix((df['C'], (df['A'], df['B']))).toarray()

Вывод:

array([[  0,   0,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0],
       [  0, 428,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0],
       [  0,   0,   0,  14,   0,   0],
       [  0,   0,   0,   0,   0, 177]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...