pandas读取Excel各工作表指定区域并将B14单元格设为索引的方法
优化实现方案
你可以根据需求选择以下两种实现路径,两种都能最终得到「每个工作表对应一个DataFrame,索引为该表B14单元格内容,数据为C19:N27区域」的结果:
方案1:单次读取(推荐,IO效率最高)
不需要分两次读取Excel,只需要一次性读取覆盖所有目标内容的最小矩形区域(B14:N27),再按位置拆分出标识符和目标数据即可,多工作表场景下能减少一半的文件解析开销,也不会出现两次读取sheet匹配错位的问题。
import pandas as pd # 单次读取所有工作表的B列到N列、第14行到27行范围 raw_sheets = pd.read_excel( f, sheet_name=None, header=None, # 关闭自动表头识别,按固定位置取值 usecols="B:N", skiprows=13, # 跳过前13行,第一行对应原表第14行 nrows=14 # 一共读14行,覆盖到原表第27行 ) res = {} for sheet_name, raw_df in raw_sheets.items(): # 读取块的(0,0)位置就是原表B14的标识符 b14_val = raw_df.iloc[0, 0] # 提取原表19-27行、C-N列对应的数据:读取块中第5行到第13行(19-14=5)、第1列到最后一列(第0列是B列,跳过) target_df = raw_df.iloc[5:14, 1:].reset_index(drop=True) # 将标识符设置为DataFrame的索引 target_df.index = [b14_val] * len(target_df) res[sheet_name] = target_df # 如果需要把所有工作表数据合并为一个大表,执行下面这行即可 # total_df = pd.concat(res.values())
方案2:兼容现有读取逻辑的拼接方案
如果你不想修改已有的两行读取代码,可以直接按工作表名匹配两次读取的结果,给每个DataFrame设置对应索引即可:
import pandas as pd # 保留你原有的读取逻辑 data = pd.read_excel(f, sheet_name=None, index_col=None, usecols="C:N", skiprows=18, nrows=8) identifier = pd.read_excel(f, sheet_name=None, index_col=None, header=None, usecols="B", skiprows=13) res = {} for sheet_name in data.keys(): # 取当前工作表B14的值:identifier中对应表的第一行第一列即为目标值 b14_val = identifier[sheet_name].iloc[0, 0] current_df = data[sheet_name].copy() # 为所有行设置索引为B14的标识符 current_df.index = [b14_val] * len(current_df) res[sheet_name] = current_df
注意:pandas读取Excel时
skiprows参数计数从0开始,对应Excel行号需要减1,取值时注意位置偏移不要写错。
内容的提问来源于stack exchange,提问作者anony1414
相关产品推荐
相关产品推荐

