You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Pandas DataFrame循环未遍历完整数据集问题排查

解决Pandas DataFrame迭代未遍历全部行的问题

嘿,我来帮你拆解下这个问题——你其实没遇到遍历中断的bug,只是被两个小细节误导了:

问题根源:混淆索引与实际行数

先看你的df.head()输出:DataFrame的索引不是连续的0、1、2,而是9、13、14这种跳着的数值!你在循环里打印的rownum = i,这个i是DataFrame的索引值,不是当前遍历的行数。所以看到3449的时候,只是当前行的索引是3449,并不是只遍历了3449行。

另外Jupyter Notebook默认会限制打印输出的行数,后面的打印内容被自动截断了,这也让你误以为循环提前终止了。

验证方法:跟踪实际遍历行数

你可以加一个计数器来确认循环确实跑完了所有行:

def dropNotIn(df):
    print(df.shape)
    removedlist = []
    droplist = []
    current_row = 0
    for idx, row in df.iterrows():
        current_row += 1
        print(f"当前已遍历 {current_row} 行,当前索引: {idx}")
        print(f"总行数: {len(df)}")

运行这个版本,你会发现current_row最终会走到59610,证明循环没有提前终止。

更优方案:别用iterrows()处理大数据集

iterrows()的效率极低,对于5万多行的DataFrame,推荐用更快的方法:

  • 用itertuples()迭代:返回命名元组,速度比iterrows()快数倍:
def dropNotIn(df):
    print(df.shape)
    removedlist = []
    droplist = []
    current_row = 0
    for row in df.itertuples():
        current_row += 1
        print(f"当前已遍历 {current_row} 行,当前索引: {row.Index}")
  • 向量化操作(强烈推荐):如果你的函数是要筛选/删除行,直接用Pandas的布尔索引会高效得多。比如假设你要删除attendance为空的行:
filtered_df = df[df['attendance'].notna()]

这种方法比循环快几个数量级,完全不需要手动遍历每一行。

解决Jupyter输出截断问题

如果是打印内容被截断,可以调整Pandas的显示设置:

import pandas as pd
pd.set_option('display.max_rows', None)  # 显示所有行
pd.set_option('display.max_columns', None)  # 显示所有列

不过大数据量下不建议全量打印,会导致Jupyter卡顿。

总结

你遇到的不是遍历中断的问题,只是被非连续索引和Jupyter的输出截断误导了。改用计数器跟踪行数,或者直接用更高效的向量化操作,就能解决你的困惑啦~

内容的提问来源于stack exchange,提问作者Branden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:52:03