Pandas中skiprows参数为何在header不变时影响DataFrame表头?
为什么Pandas v0.19.2中同时设置
header和skiprows会改变表头? 这是Pandas 0.19.x旧版本里一个容易踩坑的参数逻辑问题,和新版本的行为不一样,我来给你拆解清楚:
核心原因:旧版本中header的计数是在skiprows之后的
- 当你只写
header=9时,Pandas是从原始文件的第0行开始数,把第9行当作表头,同时自动跳过它前面的9行(因为表头行之前的内容不属于数据),这时候你的读取逻辑是对的。 - 但一旦加上
skiprows=8,Pandas会先跳过前8行,然后从剩下的行里再数第9行作为表头——相当于从原始文件的第8+9=17行开始当表头,读取到的自然是完全错误的内容。
解决办法
你有两种选择:
- 直接去掉
skiprows参数:header本身就会跳过它之前的所有行,不需要额外用skiprows重复操作,保持你最初的代码就可以正常工作:
import numpy as np import pandas as pd def answer_one(): energy = pd.read_excel(io = "Energy Indicators.xls", header = 9, parse_cols = "C:F", skip_footer = 38) return energy answer_one()
- 如果必须用
skiprows,调整header的数值:假设你要跳过前8行,然后把原始文件的第9行作为表头,那么跳过8行后,剩下的第一行就是目标表头,所以header要设为1:
def answer_one(): energy = pd.read_excel(io = "Energy Indicators.xls", header = 1, parse_cols = "C:F", skip_footer = 38, skiprows = 8) return energy
补充说明
这个反直觉的逻辑在Pandas 0.20及以后的版本中已经被修复了——新版本里header的计数会基于原始文件的行号,不再受skiprows影响,但你用的v0.19.2还遵循旧规则,所以才会出现这个问题。
内容的提问来源于stack exchange,提问作者CuriousLearner




