如何在Pandas DataFrame末尾添加固定于底部的GRAND TOTAL行?
解决Pandas DataFrame中'GRAND TOTAL'行始终位于底部的问题
以下几种方法可以确保总计行在排序后仍保持在DataFrame末尾:
方法一:先排序原数据,再添加总计行
这是最直观的方案,先对原始数据完成排序,再将总计行追加到末尾,自然不会被排序影响:
# 先对原DataFrame按索引排序 new_df_sorted = new_df.sort_index() # 计算并构造总计行 total = new_df.sum(numeric_only=True) total.name = 'GRAND TOTAL' total_df = total.to_frame().T total_df.at['GRAND TOTAL', 'CURRENCY'] = '' total_df.at['GRAND TOTAL', 'MANDATE'] = 'SomeValue' total_df.at['GRAND TOTAL', 'COMPOSITE'] = 'GRAND TOTAL' # 将排序后的原数据与总计行拼接,总计行自动位于底部 new_df_final = pd.concat([new_df_sorted, total_df.set_index('COMPOSITE')])
方法二:分离总计行后排序主数据
如果已经将总计行加入了DataFrame,可以先将其分离出来,排序剩余数据后再重新拼接:
# 分离总计行和主数据 grand_total = new_df[new_df.index == 'GRAND TOTAL'] main_data = new_df[new_df.index != 'GRAND TOTAL'] # 排序主数据 main_data_sorted = main_data.sort_index() # 重新拼接,确保总计行在最后 new_df_final = pd.concat([main_data_sorted, grand_total])
方法三:自定义排序规则强制总计行在末尾
通过自定义排序键,让'GRAND TOTAL'的排序优先级低于所有其他索引值,从而在排序时自动落在最后:
# 先完成总计行的拼接 new_df = pd.concat([new_df, total_df.set_index('COMPOSITE')]) # 自定义排序:非总计行按索引正常排序,总计行强制放在最后 new_df_sorted = new_df.loc[sorted(new_df.index, key=lambda x: (x == 'GRAND TOTAL', x))]
原理说明
排序键lambda x: (x == 'GRAND TOTAL', x)会将非总计行的键设为(False, 索引值),总计行的键设为(True, 索引值)。由于False(对应0)小于True(对应1),所有非总计行会先按索引排序,总计行则自动排在最后。
内容的提问来源于stack exchange,提问作者TourEiffel
相关产品推荐
相关产品推荐

