遍历字符串逐字符填充DataFrame时全为NaN如何解决
原代码问题点
- 索引变量
j、z未初始化,循环内也没有做索引递增,逻辑无法正常推进 - 用
df[j][z]的链式索引赋值属于pandas不推荐的写法,赋值操作只会作用在临时生成的副本对象上,不会修改原DataFrame,最终输出的全是初始化时的NaN值 - 循环逻辑设计错误:外层按字符串长度遍历,内层while循环没有同步更新字符串下标、行列下标的逻辑,要么触发死循环,要么无法匹配到正确的单元格位置
- 之前尝试的双层循环、边界判断没生效,核心原因基本都是链式索引赋值的问题,和循环逻辑本身无关
可行实现方案
首先提前确定好DataFrame的行数、列数,必须保证两者乘积等于字符串总长度,两种实现方式按需选择:
方案1:无循环高效实现(推荐)
不需要逐格遍历赋值,直接基于字符串构造DataFrame,运行效率更高,不会出现索引相关问题:
import pandas as pd import numpy as np # 替换为实际业务值 target_string = "需要填入的测试字符串abcdef123456" n_rows = 4 n_cols = 3 # 校验行列配置是否符合要求 assert n_rows * n_cols == len(target_string), "行数与列数的乘积必须等于字符串总长度" # 按行优先填充:填满一行再填下一行 df_row_first = pd.DataFrame( np.array(list(target_string)).reshape(n_rows, n_cols) ) # 按列优先填充:填满一列再填下一列 df_col_first = pd.DataFrame( np.array(list(target_string)).reshape(n_rows, n_cols, order="F") )
方案2:循环赋值正确写法
如果业务场景必须用逐格遍历赋值,要使用pandas官方支持的.iat位置索引操作,避免链式索引问题,同时正确维护下标递增:
import pandas as pd target_string = "需要填入的测试字符串abcdef123456" n_rows = 4 n_cols = 3 assert n_rows * n_cols == len(target_string), "行数与列数的乘积必须等于字符串总长度" # 初始化指定行列数的空DataFrame df = pd.DataFrame(index=range(n_rows), columns=range(n_cols)) str_index = 0 for row_idx in range(n_rows): for col_idx in range(n_cols): # 按位置给单元格赋值 df.iat[row_idx, col_idx] = target_string[str_index] str_index += 1
内容的提问来源于stack exchange,提问作者Kebaber
相关产品推荐
相关产品推荐

