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

如何在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%;"'))

关键问题解析

  1. 为什么原有代码只有transactions有值?
    你之前的代码grouped_df.loc['Total'] = pd.Series(grouped_df['transactions'].sum(), index=['transactions'])只给transactions列赋值了总和,其他列没有指定值,所以默认填充为空。

  2. 为什么要使用两级索引元组('', 'TOTAL')?
    你的grouped_df是MultiIndex(两级索引:settlementhistoryid + transactiondate),直接用单索引'Total'会创建一个层级不匹配的行,导致显示异常。用元组('', 'TOTAL')作为索引,才能生成你期望的“空一级索引,TOTAL二级索引”的总计行。

  3. 为什么要转回数值类型再计算总和?
    你之前用format函数把sales等列转成了字符串格式(比如"123.45"),字符串无法直接求和。所以必须先转回float类型计算总和,再重新格式化为字符串,保证数据格式统一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:02:36