我正在尝试使用 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,这会创建碎片化的 DataFrame(即,不是单一的底层 numpy 数组)并且正在使用
df.values
副本(而不是视图)。一个简单的解决方法是先复制一份
np.fill_diagonal
:更好的方法是避免使用循环来创建
df_cap
:并且没有
fill_diagonal
:输出: