我的知识记录

Python Excel按列排序 多列升降序

用pandas sort_values对Excel按指定列排序,支持单列升序降序、多列联合排序、按自定义顺序排序,保留原索引重置。

Python Excel按列排序

场景痛点

一份报表要按金额从高到低排,金额相同再按日期从新到旧排。Excel里点两次排序按钮,每次数据更新都得重复操作。用Python写好排序规则,一键出结果。

用到的库

pip install pandas openpyxl

完整代码

import pandas as pd

def sort_demo(input_file, output_file):
df = pd.read_excel(input_file)

# 1. 单列升序
s1 = df.sort_values(by="金额", ascending=True)

# 2. 单列降序(金额从大到小)
s2 = df.sort_values(by="金额", ascending=False)

# 3. 多列排序:先按地区升序,再按金额降序
s3 = df.sort_values(by=["地区", "金额"], ascending=[True, False])

# 4. 按自定义顺序排序:地区按指定优先级排
order = {"华东": 1, "华北": 2, "华南": 3, "西南": 4}
df["地区顺序"] = df["地区"].map(order).fillna(99)
s4 = df.sort_values(by="地区顺序").drop(columns=["地区顺序"])

# 5. 按日期列排序
df["日期"] = pd.to_datetime(df["日期"])
s5 = df.sort_values(by="日期", ascending=False)

with pd.ExcelWriter(output_file, engine="openpyxl") as writer:
s1.to_excel(writer, sheet_name="金额升序", index=False)
s2.to_excel(writer, sheet_name="金额降序", index=False)
s3.to_excel(writer, sheet_name="地区+金额", index=False)
s4.to_excel(writer, sheet_name="自定义地区顺序", index=False)
s5.to_excel(writer, sheet_name="日期最新在前", index=False)

print("排序完成")

if __name__ == "__main__":
sort_demo("./销售明细.xlsx", "./排序结果.xlsx")

代码讲解

  • sort_values(by="金额", ascending=False) 按金额降序;ascending=True 升序。
  • 多列排序时 by=["地区","金额"]ascending=[True,False] 对应每列的方向,长度必须一致。
  • 自定义顺序用 map 把类别映射成数字,再按数字排,最后把辅助列删掉。
  • 日期列先 pd.to_datetime 转类型再排,否则按字符串排会错。
  • index=False 导出时不带pandas自动生成的行号。

运行结果

生成 排序结果.xlsx,5个sheet分别对应5种排序方式,原数据不变。

注意事项

  • 排序默认把空值放在最后,想要空值在前加 na_position="first"
  • 中文排序默认按Unicode编码,不是拼音;要拼音排序用 pypinyin 库生成拼音列再排。
  • 大表排序用 kind="mergesort" 保持稳定排序,相同值的相对顺序不变。

Python Excel按列排序 多列升降序

标签:

更新时间:2026-09-15 09:03:14

上一篇:Python Excel从多个工作簿汇总到一张总表

下一篇:Python Excel删除重复保留最新一条