Python循环异常:首次运行正常,后续生成文件数值全为0
问题诊断
你遇到的问题核心是在循环中直接修改了原始DataFrame的列,导致后续循环使用的是已经被修改过的数据,而非原始数值。
让我拆解一下这个逻辑漏洞:
- 第一次循环时,你基于原始的
df['y']数值列,将其替换为"1"或"0"的字符串,保存出第一个正确的CSV。 - 但从第二次循环开始,
df['y']已经不是原始的数值了,而是上一次循环生成的"1"/"0"字符串。当你执行float(x['y'])时,得到的结果只有1.0或0.0。 - 比如第二个阈值是1.12,1.0和0.0都小于1.12,所以所有行都会被设为"0",后面的阈值同理,自然生成的文件全是0了。
解决方案
解决思路很简单:每次循环都基于原始的数值数据进行判断,而不是修改后的DataFrame。这里提供两种常用的修正方式:
方式1:提前保存原始列,循环时引用原始值
d = df_gsuvr # 原始数据 df = pd.DataFrame(data=d) # 保存原始的'y'列副本,避免被循环修改覆盖 original_y = df['y'].copy() # 把变量名从list改成更有意义的名称,避免和Python内置list类型冲突 threshold_list = [1.18, 1.12, 1.083, 1, 0.83] for number in threshold_list: # 每次都用原始的original_y来判断,而非修改后的df['y'] df['y'] = original_y.apply(lambda x: "1" if float(x) > number else "0") df.to_csv(f"{number}.csv", index=True, header=True)
方式2:每次循环都从原始数据复制新的DataFrame
d = df_gsuvr # 原始数据 threshold_list = [1.18, 1.12, 1.083, 1, 0.83] for number in threshold_list: # 每次循环都基于原始数据创建新的df副本,彻底避免修改污染 df = pd.DataFrame(data=d) df['y'] = df.apply(lambda x: "1" if float(x['y']) > number else "0", axis=1) df.to_csv(f"{number}.csv", index=True, header=True)
额外优化建议
- 避免使用
list作为变量名,这是Python的内置类型,容易引发混淆和潜在问题。 - 提前将
y列转换为数值类型,减少lambda里重复的类型转换操作,提升效率:original_y = df['y'].astype(float) df['y'] = original_y.apply(lambda x: "1" if x > number else "0")
内容的提问来源于stack exchange,提问作者vnx
相关产品推荐
相关产品推荐

