Pandas DataFrame while循环动态生成计算列出现列不匹配错误如何解决
问题解决方法
该需求完全可实现,你遇到的列不匹配报错,是因为初始化的DataFrame有9列,但赋值时仅传入了1个值,二者长度不匹配导致的。
修改逻辑说明
- 不要硬编码9个固定列名,而是根据实际循环次数
numcols动态生成对应数量的列名,适配不同的binary参数输入 - 赋值时指定当前迭代轮次对应的列,不要直接整行赋值
- 提前对齐结果DataFrame的索引与输入
pinput的索引,避免行匹配异常
修正后代码
import pandas as pd def multipleldlc(): # 先获取循环迭代次数 numcols = len(binary[0]) # 动态生成对应数量的列名 col_names = [f"ldldcisfhprob{y+1}" for y in range(numcols)] # 初始化结果DataFrame,索引和pinput对齐,初始值为NaN outputldlc = pd.DataFrame(index=pinput.index, columns=col_names) y = 0 while y < numcols: current_col = col_names[y] # 当前轮次要写入的列名 for item in binary: for i, j in pinput.iterrows(): agej = j.values[0] ldlcj = j.values[1] totalcj = j.values[2] # 注:原代码中ldlcisfh和ldlcisnotfh调用的是同一个函数、传参完全相同,大概率是逻辑遗漏,可自行修正 ldlcisfh = ldlcfh(agej, ldlcj, totalcj) ldlcisnotfh = ldlcfh(agej, ldlcj, totalcj) if item[y] == 0: ldlcprob = ldlcisnotfh else: ldlcprob = ldlcisfh # 仅给当前行的当前列赋值,不会触发列不匹配错误 outputldlc.loc[i, current_col] = ldlcprob y += 1 print(outputldlc) return outputldlc
额外优化建议
如果你不需要严格限制列的前缀格式,也可以用动态追加列的方式,不需要提前初始化所有列,每轮while循环结束后直接把当前轮次的结果作为新列追加到DataFrame中,代码会更简洁。
内容的提问来源于stack exchange,提问作者Austin Meredith
相关产品推荐
相关产品推荐

