【问题标题】:How to set values in diagonal and repeat over all rows?如何在对角线上设置值并在所有行上重复?
【发布时间】:2020-05-08 03:40:59
【问题描述】:

我有一个时间序列数据框,其中填充了 0 和不同数量的列,我想从第一行和第一列开始以 100 填充对角线中的值。我可以使用下面问题中提出的解决方案,但在填充最后一列的值后它会停止。 Set values on the diagonal of 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

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    这是一种基于 n​​umpy 的方法,根据列的数量进行整形,并使用给定的值分配回切片:

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

    【讨论】:

    • 一般情况:m,n = a.shape; for i in range(m): a[i:m:n, i:m:n] = 100
    猜你喜欢
    • 2014-08-19
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    相关资源
    最近更新 更多