我正在尝试使用 numpy.fill_diagonal() (如这个答案所示)将我的数据帧的对角线条目更改为 20,000。 但是,当我运行下面的示例时,数据框中的对角线条目保持为零。我的问题是“为什么?”
请不要发布一些显示如何使用 for 循环更改对角线条目的答案。 我可以自己更改对角线条目。 我的问题是为什么下面的示例无法更改条目。如果我不明白为什么下面的示例失败,我就不能在任何代码中依赖 numpy.fill_diagonal() 。 我正在使用 numpy 版本 2.1.0 和 pandas 版本 2.2.2。
import numpy as np
import pandas as pd
nodes = ['A','B','C','D','E','F','G','H']
df_cap = pd.DataFrame(None, index=nodes, columns=nodes)
edges = {
('A', 'B'): 809, ('A', 'C'): 184, ('A', 'D'): 440, ('B', 'C'): 134,
('B', 'E'): 277, ('B', 'F'): 138, ('C', 'D'): 194, ('C', 'F'): 144,
('C', 'G'): 139, ('D', 'E'): 190, ('D', 'G'): 284, ('E', 'F'): 100,
('E', 'H'): 281,('F', 'H'): 922,('G', 'F'): 123,('G', 'H'): 232
}
for i in nodes:
for j in nodes:
if (i,j) in edges:
df_cap.loc[i,j] = edges[(i,j)]
nodes = nodes + ["Dummy"]
df_cap = df_cap.astype(float).fillna(0)
df_cap.loc["Dummy", :] = 0
df_cap.loc[:, "Dummy"] = 0
np.fill_diagonal(df_cap.values, 20000)
df_cap.loc["A", "Dummy"] = 20000
df_cap.loc["Dummy", "H"] = 20000
df_cap
问题是您使用循环来填充 DataFrame,这创建了一个碎片 DataFrame(即不是整体底层 numpy 数组),并且使用
df.values
正在制作副本(不是视图)。
一个简单的解决方法可能是在
np.fill_diagonal
: 之前进行复制
df_cap = df_cap.copy()