最省事的办法是用 usecols 在读入时直接过滤列,支持列名或索引列表,推荐列名;无 header 时需设 header=None 并配 names,有 header 重命名要加 skiprows=1;usecols 和 names 需长度一致,且须先解决编码、分隔符等解析问题。
用 pandas.read_csv() 的 usecols 直接跳过无关列
最省事的办法不是读完再删,而是在读入时就过滤掉不需要的列。这能减少内存占用、加快加载速度,尤其对大文件很关键。
常见错误是先用 df = pd.read_csv(...) 再写 df.drop(...),白白多占一倍内存。
-
usecols支持传入列名列表(如['name', 'age'])或列索引列表(如[0, 2, 4]),推荐用列名——更稳定,不依赖 CSV 列顺序变动 - 如果原始 CSV 有 header,
usecols里的名字必须和 header 完全一致(包括空格、大小写);若无 header,得配合header=None用数字索引 - 注意:
usecols不影响index_col或parse_dates等参数的行为,但被过滤掉的列不能在这些参数里引用,否则报错ValueError: Usecols do not match columns
df = pd.read_csv('data.csv', usecols=['user_id', 'email', 'created_at'])
字段名映射用 names + header 组合控制
当 CSV 没有表头,或表头名不符合你代码里的命名习惯(比如 CSV 是 usr_name,你只想叫 name),就得靠 names 显式定义字段名。
容易踩的坑是只设 names 却忘了关掉原 header:默认会把第一行当列名,导致 names 被忽略,或者多出一行数据。
- CSV 无 header → 设
header=None+names=['id', 'name', 'score'] - CSV 有 header 但想重命名 → 设
header=0(默认值)+names=['uid', 'full_name', 'pts']+skiprows=1(跳过原 header 行) - 如果用了
skiprows=1却没配names,pandas 会把第二行当新 header,结果列名变成数据,后续取列报KeyError
df = pd.read_csv('raw.csv', header=None, names=['uid', 'email'], skiprows=1)
混合场景:既要跳列又要改名,优先走 usecols + names
比如 CSV 有 10 列,你只关心第 1、3、7 列,且希望它们分别叫 id、title、updated——这时别用 usecols 传名字(因为原名可能不统一),改用列索引 + names 更可靠。
使用 qbo-mileage CLI 及用户凭证,从 Airtable、Outlook 或 Google Calendar 记录生成 QuickBooks Online 里程 CSV 文件。
性能上,usecols 传索引比传名字略快一点点,因为少一次列名匹配;但可读性差,维护成本高。权衡之下,小项目用名字,自动化流水线用索引。
-
usecols=[0, 2, 6]和names=['id', 'title', 'updated']必须长度一致,否则报Length mismatch - 如果 CSV 原本有 header,又用了
usecols索引 +names,建议加header=0并确认skiprows=1是否需要——多数情况要,否则第一行 header 会被当数据读进来 - 别在同一个调用里混用
usecols(名字)和names,pandas 不会自动对齐,容易列错位
df = pd.read_csv('log.csv', usecols=[0, 2, 6], names=['ts', 'level', 'msg'], header=0, skiprows=1)
遇到编码或分隔符异常时,usecols 和 names 仍生效但可能失效
这两个参数是在解析阶段之后才起作用的。如果 CSV 格式本身有问题(比如中文乱码、逗号在字段值里没转义、tab 和 comma 混用),pandas 可能提前解析失败,根本走不到列筛选逻辑。
典型现象是报错信息里带 ParserError 或 UnicodeDecodeError,这时候再怎么调 usecols 都没用。
- 先试
encoding='utf-8-sig'或encoding='gbk'解决中文乱码;Windows 记事本存的 CSV 常需前者 - 分隔符不准就加
sep=';'或sep='\t',别依赖默认的逗号——尤其导出自 Excel 的 CSV 可能用分号 - 字段含换行或引号时,确保
quoting=csv.QUOTE_MINIMAL(默认值),必要时手动 import csv 后传quoting=csv.QUOTE_ALL
字段映射和列过滤的前提是文件能正常解析。错在这一步,后面全白搭。










