Python 如何设置对角线上的值并在所有行上重复?

Python 如何设置对角线上的值并在所有行上重复?,python,pandas,numpy,Python,Pandas,Numpy,我有一个timeserie数据帧,其中填充了0和不同数量的列,我想在对角线中填充值,从第一行和第一列开始,以100开头。我可以使用下面问题中提出的解决方案,但在最后一列的值被填充后,它就会停止。 我怎样才能让它在所有行上重复 这就是我的数据帧的外观: 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 202

我有一个timeserie数据帧,其中填充了0和不同数量的列,我想在对角线中填充值,从第一行和第一列开始,以100开头。我可以使用下面问题中提出的解决方案,但在最后一列的值被填充后,它就会停止。

我怎样才能让它在所有行上重复

这就是我的数据帧的外观:

                               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
当有两列时,我想是这样的:

                               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

这是一种基于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]

其他一些例子:

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]])

对于一般情况:
m,n=a.shape;对于范围内的i:a[i:m:n,i:m:n]=100
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]])