Google Colab下载的DataFrame与显示数据不符的原因排查
问题分析与解决方案
核心问题原因
- 循环+append的稳定性问题:处理200万行数据时,用
iterrows逐行遍历并反复调用append会导致严重的性能损耗,甚至可能因为Colab的内存限制、会话波动,导致newPrintable未正确写入最终筛选结果,出现显示行数与实际导出文件不一致的情况。 - 条件判断的冗余与潜在遗漏:你的判断逻辑中重复对比了
223和223.0(Python中数值223 == 223.0为True),虽然逻辑上等价,但如果数据中存在未覆盖的格式(比如带空格的" 223"),会错误保留不符合要求的行。
优化后的筛选代码(高效且准确)
from google.colab import files import pandas as pd # 定义判断是否为墨西哥国籍的函数 def is_mexican(x): if pd.isna(x): return False # 统一转换为字符串并去除首尾空格,覆盖所有格式情况 cleaned_val = str(x).strip() return cleaned_val in {"223", "223.0"} # 生成筛选掩码:保留「父母不全为墨西哥」的行 filter_mask = ~(printableNacimientos["PA_NACIONALIDAD"].apply(is_mexican) & printableNacimientos["MA_NACIONALIDAD"].apply(is_mexican)) # 应用筛选并复制数据,避免视图引发的异常 newPrintable = printableNacimientos[filter_mask].copy() # 导出CSV newPrintable.to_csv('newPrintable.csv', index=False, sep="|", na_rep=r'\N') files.download('newPrintable.csv') # 验证最终行数 print(f"筛选后有效行数:{len(newPrintable)}")
关键改进点
- 向量化操作替代循环:用
apply实现批量判断,比iterrows快数十倍,彻底避免循环带来的内存与稳定性问题。 - 统一格式处理:将所有值转换为字符串并去空格,覆盖所有可能的编码格式(包括潜在的带空格、特殊字符的情况)。
- 直观的逻辑掩码:直接用
~(父墨西哥 & 母墨西哥)表示保留目标行,逻辑清晰,不易出错。
额外排查建议
- 检查Colab会话的内存状态:200万行的DataFrame占用内存较高,若会话内存不足,可能导致数据处理异常。
- 验证筛选结果:执行以下代码确认是否还存在双亲均为墨西哥的行:
invalid_rows = newPrintable[(newPrintable["PA_NACIONALIDAD"].apply(is_mexican) & newPrintable["MA_NACIONALIDAD"].apply(is_mexican))] print(f"无效行数(双亲均为墨西哥):{len(invalid_rows)}")
内容的提问来源于stack exchange,提问作者Danielr19
相关产品推荐
相关产品推荐

