如何在Pandas多索引DataFrame中使用loc添加完整底部总计行
解决两级索引DataFrame添加全列总计的问题
你的问题核心有两个:一是只给transactions列赋值了总计,其他列自然为空;二是原DataFrame是两级MultiIndex,直接用单索引'Total'添加行,会导致索引层级不匹配,不符合你期望的输出格式。下面是具体的解决方法:
修正后的完整代码片段
df = pd.DataFrame(transaction_object) # Check if dataframe empty if df.empty: messages.error(request, 'No Data Found') context['desc'] = 'Summary Reports' return render(request, 'console/reports.html', context=context) df.settlementhistoryid = df.settlementhistoryid.replace(settlement_date) def format(x): return "{:.2f}".format(x / 100) def card_scheme_rules(x): a = x['transactionsequencenumber'].nunique() b = x[df['transactiontype'] == 1]['transactionamount'].sum() c = x[df['transactiontype'] == 4]['transactionamount'].sum() d = x[df['transactiontype'] == 3]['transactionamount'].sum() e = x['transactionamount'].sum() return pd.Series([a, b, c, d, e], index=['transactions', 'sales', 'refund', 'cashback', 'Total']) df.settlementhistoryid = pd.to_datetime(df.settlementhistoryid).dt.strftime('%d-%m-%Y') df.transactiondate = pd.to_datetime(df.transactiondate).dt.strftime('%d-%m-%Y') grouped_df = df.groupby(['settlementhistoryid', 'transactiondate']).apply(card_scheme_rules) # --- 关键修正部分 --- # 1. 先把格式化后的字符串列转回数值类型(因为要计算总和) for col in ['sales', 'refund', 'cashback', 'Total']: grouped_df[col] = grouped_df[col].astype(float) # 2. 计算所有列的总计值 total_values = { 'transactions': grouped_df['transactions'].sum(), 'sales': grouped_df['sales'].sum(), 'refund': grouped_df['refund'].sum(), 'cashback': grouped_df['cashback'].sum(), 'Total': grouped_df['Total'].sum() } # 3. 重新格式化总计值,保持和原有数据格式一致 for col in ['sales', 'refund', 'cashback', 'Total']: total_values[col] = "{:.2f}".format(total_values[col]) # 4. 用两级索引元组添加总计行(空一级索引,二级索引为'TOTAL') grouped_df.loc[('', 'TOTAL'), :] = total_values # --- 修正结束 --- card_scheme_html_class = str(grouped_df.to_html().replace('class="dataframe"', 'class="display" style="width:100%;"'))
关键问题解析
为什么原有代码只有
transactions有值?
你之前的代码grouped_df.loc['Total'] = pd.Series(grouped_df['transactions'].sum(), index=['transactions'])只给transactions列赋值了总和,其他列没有指定值,所以默认填充为空。为什么要使用两级索引元组
('', 'TOTAL')?
你的grouped_df是MultiIndex(两级索引:settlementhistoryid + transactiondate),直接用单索引'Total'会创建一个层级不匹配的行,导致显示异常。用元组('', 'TOTAL')作为索引,才能生成你期望的“空一级索引,TOTAL二级索引”的总计行。为什么要转回数值类型再计算总和?
你之前用format函数把sales等列转成了字符串格式(比如"123.45"),字符串无法直接求和。所以必须先转回float类型计算总和,再重新格式化为字符串,保证数据格式统一。
内容的提问来源于stack exchange,提问作者Scott Benson
相关产品推荐
相关产品推荐

