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
相关产品推荐
相关产品推荐

