如何按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
相关产品推荐
相关产品推荐

