gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:07:15 25 4
gpt4 key购买 nike

我有一个由 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

最佳答案

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

关于python - 如何在对角线上设置值并在所有行上重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61651953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com