read_csv 会把数字列误判为字符串,因为 Pandas 默认仅扫描前100行推断类型,遇后续非数字值(如空字符串、"NULL")便回退为object类型,导致astype(int)报错;应显式指定dtype(如"Int64")、配合na_values与keep_default_na,并用pd.to_numeric(..., errors="coerce")安全转换。

为什么 read_csv 会把数字列误判为字符串?
因为 Pandas 默认只扫描前 100 行(nrows=100)做类型推断,遇到后面才出现的非数字值(比如空字符串、"NULL"、"N/A"、甚至某行多了一个逗号),就会回退到 object 类型。一旦列为 object,后续用 astype(int) 直接报错,而不是静默转成 NaN。
- 典型错误现象:
ValueError: invalid literal for int()或TypeError: object of type 'str' has no len() - 真实场景:日志文件中某列大部分是整数,但第 5000 行插入了注释行
"# missing data" - 关键参数:
dtype显式指定比依赖自动推断更可靠;na_values和keep_default_na要配合使用
怎样用 dtype 参数精准控制每列类型?
直接告诉 Pandas 每列该是什么类型,跳过推断阶段。尤其对数值列,优先用可空类型(如 Int64、string)而非 int64 或 object,避免因 NaN 导致类型 fallback。
-
dtype={"user_id": "Int64", "score": "float64", "tag": "string"}—— 注意首字母大写的Int64是 pandas 可空整型,小写int64不接受NaN - 批量设置:用
{col: "string" for col in string_columns}构造字典,避免手写长列表 - 如果列名含空格或特殊字符,
dtype键必须严格匹配实际列名(可用header=0后先df.columns.tolist()确认)
遇到混合数据(数字+文本)时怎么安全转换?
别硬转,先用 pd.to_numeric(..., errors="coerce") 把疑似数字列转成浮点,并把非法值变 NaN;再按需向下转型(如 .astype("Int64"))。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
-
df["amount"] = pd.to_numeric(df["amount"], errors="coerce")—— 这比astype(float)安全得多 - 若原始列有百分号(如
"95%"),先.str.rstrip("%").astype(float),但得确保无空值,否则加.str.replace(r"^\s*$", "0", regex=True) - 性能注意:
errors="coerce"比"raise"慢,但比失败后重试强;大数据集建议先采样检查异常值分布
读取超大文件时如何边读边校验类型?
用 chunksize 分块读取,对每块做类型检查和清洗,再拼接。避免一次性加载出错后整个失败。
立即学习“Python免费学习笔记(深入)”;
chunks = pd.read_csv("data.csv", chunksize=10000, dtype={"id": "Int64"})- 每块处理:检查
chunk["id"].isna().sum()是否突增,判断是否需调整na_values - 合并时用
pd.concat(chunks, ignore_index=True),别用append(已弃用) - 内存敏感场景:处理完一块就
del chunk,显式触发垃圾回收(import gc; gc.collect())
最易被忽略的是 keep_default_na=False 配合自定义 na_values —— 默认的 ["NA", "NULL", ""] 有时会误吞合法字符串,比如用户昵称真叫 "NULL",结果整列变 NaN。动手前先 head -n 200 data.csv | grep -n "NULL" 看上下文。

















