You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按sidetable生成的subtotal行对聚合后的DataFrame进行排序?

按Sidetable小计行排序DataFrame的实现方法

没问题!要实现按sidetable生成的小计行值来排序recap_table,我们可以分几步操作,核心思路是先提取每个分组的小计值,给整个表添加排序依据,最后按这个依据排序同时保持组内的明细行+小计行的结构:

步骤1:确认小计行的标识

sidetable默认会给小计行的分组列填充Subtotal(如果是多级分组,最内层的分组列会显示这个标签),你可以先查看recap_table的内容确认:

print(recap_table["Libellé de l'écart quantité - Ordre"].unique())

如果你的小计用了自定义标签(比如通过subtotal(label="自定义标签")设置的),记得后续代码里替换成对应的文本。

步骤2:提取每个分组的小计值

我们先筛选出所有小计行,把每个主分组(Cofor - Expéditeur)对应的小计值存成字典,用来作为排序键:

# 筛选小计行,假设小计行的"Libellé de l'écart quantité - Ordre"值为"Subtotal"
subtotal_rows = recap_table[recap_table["Libellé de l'écart quantité - Ordre"] == "Subtotal"].reset_index()

# 替换成你实际用来排序的聚合列名(比如agg_func_count对应的列,比如'count'或'total')
sort_column = "你的聚合列名"
# 创建主分组到小计值的映射字典
subtotal_mapping = dict(zip(subtotal_rows["Cofor - Expéditeur"], subtotal_rows[sort_column]))

步骤3:添加排序辅助列

给整个recap_table添加两个辅助列:一个是每个行对应的分组小计值,另一个用来区分是否是小计行(保证组内明细行在前,小计行在后):

# 添加排序键:每个行对应其所属分组的小计值
recap_table["sort_key"] = recap_table["Cofor - Expéditeur"].map(subtotal_mapping)

# 处理总计行(如果存在):把它的排序键设为无穷大,让它排在最后
if "Total" in recap_table["Cofor - Expéditeur"].values:
    recap_table.loc[recap_table["Cofor - Expéditeur"] == "Total", "sort_key"] = float("inf")

# 添加标识列:区分是否是小计行
recap_table["is_subtotal"] = recap_table["Libellé de l'écart quantité - Ordre"] == "Subtotal"

步骤4:执行排序并清理辅助列

按排序键排序(可以选择升序或降序),同时保证组内小计行在最后,最后删除辅助列:

# 按小计值降序排序,组内明细行在前、小计行在后
sorted_recap = recap_table.sort_values(
    by=["sort_key", "is_subtotal"],
    ascending=[False, True]  # 第一个False表示降序,第二个True让非小计行(False)排在前面
).drop(["sort_key", "is_subtotal"], axis=1)

注意事项

  • 如果你用了多个聚合函数(比如agg_func_count包含多个统计项),一定要指定正确的sort_column,比如你想按小计的count值排序就选对应的列名。
  • 如果你的小计标签不是默认的Subtotal,要把代码中所有的"Subtotal"替换成你的自定义标签。

内容的提问来源于stack exchange,提问作者AW_S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 19:54:06