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"保持稳定排序,相同值的相对顺序不变。

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