对于动态分组,如何使总计始终显示在分组的末尾?

2024-07-04 07:45:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经设法接近了,因为我能够正确地总结每个小组的总数,我的问题是让总数出现在每个小组的末尾,下面是我的工作- (我使用Django,所以我使用queryset作为数据)

df = pd.DataFrame(list(
        get_daily_transaction_object(value, SQLLIST, date).values('posgroupid',
                                                                  'posid',
                                                                  'cardscheme',
                                                                  'transactionamount',
                                                                  'transactiontype',
                                                                  'currencycode')))
        def f(x):
        a = x['transactionamount'].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'])

    grouped_df = df.groupby(['currencycode',
                             'posgroupid',
                             'posid',
                             'cardscheme']).apply(f)

    subtotal = grouped_df.sum(level=[0, 1, 2]).assign(cardscheme='Total').set_index('cardscheme', append=True)

    grouped_new = pd.concat([grouped_df, subtotal]).sort_index()

    context = {'desc': 'Transaction Report',
               'report': grouped_new.to_html(classes='white_space_df')
               }

上面的计算是正确的,但将总数放在看似随机的位置,这在动态调整数据大小时会引起问题

是否有一种方法可以使总数始终显示在组的末尾? 参考图片。 python pandas


Tags: 数据dfindex小组pdsum末尾总数
1条回答
网友
1楼 · 发布于 2024-07-04 07:45:34

看起来您正在将Total设置为cardscheme的实例,以便将其分组到cardscheme列下。然后将cardscheme设置为索引,最后对索引进行排序。因此,Total与其他cardscheme(如Visa卡、万事达卡)一起按字母顺序排序(作为索引)

您是否可以先对其他cardscheme项目进行排序(按索引排序),然后在不进一步对索引排序的情况下添加总计?仅举一个示例(未完全测试),将代码顺序更改为:

grouped_df = df.groupby(['currencycode',
                             'posgroupid',
                             'posid',
                             'cardscheme']).apply(f)

# add the following to set index and sort the index before concat Total
sorted_grouped_df = grouped_df.set_index('cardscheme').sort_index()


subtotal = grouped_df.sum(level=[0, 1, 2]).assign(cardscheme='Total').set_index('cardscheme', append=True)

# revise to concat the sorted_grouped_df with subtotal AND remove sort index
grouped_new = pd.concat([sorted_grouped_df, subtotal])

相关问题 更多 >

    热门问题