使用pandas导入Excel如何将第8行设为表头并重命名列
问题原因
核心踩坑点集中在3个方面:
- pandas读取Excel的行号默认是0起始索引,和Excel界面显示的1起始行号差1,
skiprows和header的联动逻辑理解错误,导致行完全错位。 - xlsm是带宏的Excel格式,pandas默认引擎无法识别,必须指定对应读取引擎。
- 表头行前两列为NaN时,普通按列名匹配的rename逻辑会失效,因为NaN不等于自身,且字典中重复的NaN键会被后者覆盖。
最优实现步骤
1. 先定位表头行的真实索引
不要靠猜测配参数,先读入原始无表头的Excel内容,确认要作为表头的日期行对应的0索引行号N:
# 先安装依赖:pip install openpyxl df_raw = pd.read_excel('sheet.xlsm', header=None, engine='openpyxl') # 打印前10行,找到日期行的0索引行号N print(df_raw.head(10))
如果你看到的日期行是Excel界面左侧显示的第8行,那对应的0索引N=7,可以直接跳过这步。
2. 正确读入数据
根据确认的行号配置参数,一步完成跳过前置行、指定表头的操作:
df = pd.read_excel( 'sheet.xlsm', skiprows=N, # 跳过表头行之前的所有N行,仅保留表头及之后的有效内容 header=0, # 将跳过行之后的第一行(即原日期表头行)设为列名 engine='openpyxl' # 必须指定,用于读取xlsm格式文件 )
以Excel界面第8行(N=7)为表头为例,代码简化为:df = pd.read_excel('sheet.xlsm', skiprows=7, header=0, engine='openpyxl')
3. 重命名前两列
因为表头行前两列是NaN,不要用按列名匹配的rename逻辑,直接按列索引修改,完全规避NaN匹配失效的问题:
# 直接按位置修改前两列的列名,和原列名取值无关 df.columns.values[0] = "col1" df.columns.values[1] = "col2"
之前操作的错误点说明
- 最初的参数配置错误:
skiprows=8会跳过前8行(0~7索引),刚好把你要当表头的0索引7行完全跳过,再加header=1,相当于用跳过前置行之后的第二行当表头,整体行错位了一位,导致日期行跑到了普通数据区。 - 手动重命名失效的原因:你取的表头行前两列都是NaN,构造rename字典时,两个NaN作为键会被Python字典去重,后写的
{NaN: "col2"}会覆盖前面的{NaN: "col1"},最终所有列名为NaN的列都被改成col2,和你输出的结果一致。
内容的提问来源于stack exchange,提问作者asd
相关产品推荐
相关产品推荐

