如何循环遍历DataFrame累加列值到和为1并输出对应行与迭代次数
问题核心错误排查
- 累加逻辑错误:迭代时你累加的是整个Di列的总和,而非当前遍历行的单个Di值
- 循环逻辑错误:仅设置了1次遍历DataFrame的逻辑,跑完32768行就终止,而整个Di列的总和仅为2.1e-06,单次遍历的累加和远达不到1的目标,需要循环重复遍历DataFrame。
iterrows迭代性能极低,百万级迭代场景下运行效率会非常差,不建议使用。
实现方案
基础实现
提前将Di列转为numpy数组提升访问速度,设置外层循环重复遍历DataFrame,直到累加和达标:
import pandas as pd # 预取Di列数组与DF行数,减少重复访问开销 di_list = df['Di'].to_numpy() df_len = len(df) current_sum = 0.0 total_iter = 0 result_row = None threshold = 1 # 可根据需求调整精度,比如0.9999999 while current_sum < threshold: for idx in range(df_len): current_sum += di_list[idx] total_iter += 1 if current_sum >= threshold: result_row = df.iloc[idx] break if result_row is not None: break # 输出结果 print(f"总迭代次数: {total_iter}") print(f"最终累加和: {current_sum}") print("终止行的全部数据:") print(result_row)
性能优化版
可以先计算可完整遍历DF的轮次,跳过大量无意义的逐行判断,性能提升可达百倍以上:
di_total = df['Di'].sum() # 计算不需要逐行判断的完整遍历轮次 full_rounds = int(threshold // di_total) current_sum = full_rounds * di_total total_iter = full_rounds * df_len # 最后仅需要在单次遍历中找到凑够剩余差值的行 remaining = threshold - current_sum for idx in range(df_len): current_sum += di_list[idx] total_iter += 1 if current_sum >= threshold: result_row = df.iloc[idx] break
注意事项
- 浮点数累加存在精度误差,可根据需求调整阈值的容差范围,比如将判断条件改为
abs(current_sum - 1) < 1e-8即可视为达标 - 如果需要累加和尽可能接近1而非超过1,可以将判断条件改为
current_sum + di_list[idx] >= threshold,取累加前的数值作为最终结果即可
内容的提问来源于stack exchange,提问作者Akhilesh Arkala
相关产品推荐
相关产品推荐

