Python pandas读取Excel文件:read_excel一键转DataFrame
用pandas的read_excel读取xlsx,指定表头、跳过行、按列名筛选、读指定sheet,读出来直接就是DataFrame,适合数据分析场景。
场景痛点
openpyxl 适合改格式、写格子,但拿到一份表要做筛选、聚合、统计时,逐格写循环太啰嗦。pandas 一行 read_excel 就把整张表读成 DataFrame,后面 df.groupby、df.head、df[df["金额"]>1000] 全都能用,效率高一个数量级。
用到的库
pip install pandas openpyxl
pandas 读 .xlsx 默认走 openpyxl 引擎,所以两个都要装。
完整代码
import pandas as pd
def demo_read(file_path: str) -> None:
# 1) 最基础:整张表读成 DataFrame,第一行当表头
df = pd.read_excel(file_path, sheet_name="销售明细")
print(df.head()) # 前 5 行
print("形状:", df.shape) # (行数, 列数)
print("列名:", df.columns.tolist())
# 2) 只读指定列,省内存
df2 = pd.read_excel(file_path, sheet_name="销售明细",
usecols=["日期", "区域", "金额"])
print(df2.head())
# 3) 跳过前 N 行(表上面有标题、说明文字时常用)
df3 = pd.read_excel(file_path, sheet_name="销售明细",
skiprows=0, header=0)
# 4) 同时读多个 sheet
sheets = pd.read_excel(file_path, sheet_name=["销售明细", "汇总"])
for name, df_sheet in sheets.items():
print(f"--- {name} ---")
print(df_sheet.head())
# 5) 读完直接做统计
total = df.groupby("区域")["金额"].sum()
print("各区域总金额:\n", total)
big = df[df["金额"] > 1000]
print("金额大于1000的行:\n", big)
if __name__ == "__main__":
demo_read(r"D:\reports\销售明细.xlsx")
代码讲解
pd.read_excel(路径, sheet_name="销售明细")默认把第一行当列名;sheet_name=None会把所有 sheet 读成一个字典。usecols=["日期","区域","金额"]只读需要的列,几万行的表能省一大半内存。skiprows用来跳过表前面的说明行;如果表头不在第一行,配合header=N指定哪一行是表头。- 读出来的
df就是 DataFrame,df.head()看前几行,df.shape看行列数,df.columns看列名。 - 最后两行演示直接在 DataFrame 上做分组求和和条件筛选,这是 pandas 相比 openpyxl 的核心优势。
运行结果
控制台依次打印表头预览、行列数、列名、指定列预览、两个 sheet 的前几行,最后输出各区域总金额和金额大于 1000 的行。把路径换成自己的文件即可。
注意事项
- pandas 本身不负责解析 xlsx,底层用 openpyxl(读)或 xlsxwriter(写),缺了引擎会报
ImportError,按提示pip install openpyxl。 .xls老格式需要装xlrd,且新版 xlrd 不再支持 xlsx,建议统一转成.xlsx。- 日期列读出来默认是
datetime64,做比较、排序直接用;要转字符串用df["日期"].dt.strftime("%Y-%m-%d")。 - 空单元格读出来是
NaN,做统计前记得df.dropna()或df.fillna(0)。 - 特别大的表(几十万行)
read_excel较慢,可以先在 Excel 里另存为 CSV 再用pd.read_csv。

更新时间:2026-09-15 09:02:22
上一篇:Python读取Excel单元格数据:openpyxl逐格取值详解