Python Pandas矩阵设置及While循环死循环问题求助
解决Pandas DataFrame死循环及矩阵逻辑实现问题
问题描述
创建一个15×15的Pandas DataFrame,所有单元格初始值为0.9,需要实现以下逻辑:
- 将矩阵对角线设置为0;
- 每行中若某单元格值为0,则将其前后5列的单元格设为1(即
df.iloc[i][j] = 0时,设置df.iloc[i][j+5] = 1或df.iloc[i][j-5] = 1,需确保列索引在有效范围内)。
但编写的脚本陷入死循环无法结束,请求解决。
输入代码
row, col = 15, 16 a = pd.DataFrame.from_records([[0.9]*col]*row) a = a.loc[:, a.columns != 0]
预期输出
预期得到一个15×15矩阵:
- 对角线位置全为0;
- 每个0的位置,若存在
j+5列则设为1,若存在j-5列则设为1; - 其余位置保持初始值0.9。
当前死循环脚本
row, col = 15, 16 a = pd.DataFrame.from_records([[0.9]*col]*row) a = a.loc[:, a.columns != 0] column3 = list(a) for i, j in a.iterrows(): for k in column3: if k == i + 1: a.iloc[i][k] = 0 for i, j in a.iterrows(): for k in column3: step = +5 if k <=5 else -5 while k <= len(a.index): if a.iloc[i][k] == 0: k += step a.iloc[i][k] = 1 pd.set_option('display.max_rows', None) pd.set_option('display.max_columns', None) a
死循环原因分析
第二个嵌套循环中的while k <= len(a.index)存在逻辑错误:
len(a.index)是15,但DataFrame的列索引是0到14,当k增加到15时,访问a.iloc[i][k]会触发索引越界,且循环没有终止条件;step的设置逻辑不合理,导致k会持续累加,无法跳出循环。
修正后的代码
import pandas as pd # 初始化15×15的DataFrame,所有值为0.9 df = pd.DataFrame([[0.9]*15 for _ in range(15)]) # 设置对角线为0 for i in range(15): df.iloc[i, i] = 0 # 遍历每行,处理0的前后5列 for i in range(df.shape[0]): # 找到当前行中值为0的列索引 zero_cols = df.loc[i][df.loc[i] == 0].index for j in zero_cols: # 检查j+5列是否在有效范围内 if j + 5 < df.shape[1]: df.iloc[i, j+5] = 1 # 检查j-5列是否在有效范围内 if j - 5 >= 0: df.iloc[i, j-5] = 1 # 显示完整矩阵 pd.set_option('display.max_rows', None) pd.set_option('display.max_columns', None) print(df)
代码说明
- 初始化优化:直接创建15×15的DataFrame,避免原代码中创建16列再删除的冗余操作;
- 对角线设置:用简单循环直接定位
iloc[i,i],比iterrows更高效; - 边界检查:处理前后5列时,先判断索引是否在0到14的有效范围内,避免索引越界;
- 无死循环:通过遍历每行的0位置并逐一处理,逻辑清晰,不会出现无限循环。
内容的提问来源于stack exchange,提问作者Laura
相关产品推荐
相关产品推荐

