Как установить значения по диагонали и повторить для всех строк? - PullRequest
4 голосов
/ 07 мая 2020

У меня есть таймер ie фрейм данных, заполненный 0 и различным количеством столбцов, и я хотел бы заполнить значения по диагонали со 100, начиная с первой строки и первого столбца. Я мог бы использовать решение, предложенное в вопросе ниже, но оно останавливается после заполнения значения последнего столбца. Установить значения по диагонали pandas .DataFrame

Как сделать так, чтобы это повторялось во всех строках?

Вот как выглядит мой фрейм данных:

                               A      B
2020-05-02 23:00:00+00:00    0.0    0.0
2020-05-03 00:00:00+00:00    0.0    0.0
2020-05-03 01:00:00+00:00    0.0    0.0
2020-05-03 02:00:00+00:00    0.0    0.0
2020-05-03 03:00:00+00:00    0.0    0.0

Но, как вы можете видеть, использование Numpy fill_diagonal не завершает работу.

import numpy as np
np.fill_diagonal(df.values, 0)

                               A      B
2020-05-02 23:00:00+00:00  100.0    0.0
2020-05-03 00:00:00+00:00    0.0  100.0
2020-05-03 01:00:00+00:00    0.0    0.0
2020-05-03 02:00:00+00:00    0.0    0.0
2020-05-03 03:00:00+00:00    0.0    0.0

Когда есть 2 столбца, я бы хотел примерно так:

                               A      B
2020-05-02 23:00:00+00:00  100.0    0.0
2020-05-03 00:00:00+00:00    0.0  100.0
2020-05-03 01:00:00+00:00  100.0    0.0
2020-05-03 02:00:00+00:00    0.0  100.0
2020-05-03 03:00:00+00:00  100.0    0.0

1 Ответ

4 голосов
/ 07 мая 2020

Вот подход, основанный на numpy, изменение формы на основе количества столбцов и среза, возвращающего заданное значение:

def fill_wrapped_diag(a, fill_val):
    r,c = a.shape
    r_left = c-r%c
    a_ext = np.pad(a, ((0,r_left),(0,0)))
    a_r = a_ext.reshape((r+r_left)//c, -1)
    a_r[:,::c+1] = fill_val
    return a_r.reshape(a_ext.shape)[:-r_left]

df[:] = fill_wrapped_diag(df.values, 100)
print(df)
                               A      B
2020-05-02-23:00:00+00:00  100.0    0.0
2020-05-03-00:00:00+00:00    0.0  100.0
2020-05-03-01:00:00+00:00  100.0    0.0
2020-05-03-02:00:00+00:00    0.0  100.0
2020-05-03-03:00:00+00:00  100.0    0.0

Некоторые другие примеры:

a = np.zeros((8,4))
fill_wrapped_diag(a, fill_val=100)

array([[100.,   0.,   0.,   0.],
       [  0., 100.,   0.,   0.],
       [  0.,   0., 100.,   0.],
       [  0.,   0.,   0., 100.],
       [100.,   0.,   0.,   0.],
       [  0., 100.,   0.,   0.],
       [  0.,   0., 100.,   0.],
       [  0.,   0.,   0., 100.]])

a = np.random.randint(0,10,(7,3))
fill_wrapped_diag(a, fill_val=75)

array([[75,  8,  8],
       [ 4, 75,  7],
       [ 3,  5, 75],
       [75,  5,  5],
       [ 5, 75,  2],
       [ 3,  6, 75],
       [75,  1,  8]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...