如何在Pandas与Python中生成分组排序的汇总数据
修正后的代码实现
核心问题在于你的Amount列大概率是字符串类型,导致sum聚合时变成字符串拼接而非数值求和;同时缺少按交易次数降序的排序逻辑,也没有总计统计。以下是修正后的完整代码:
import pandas as pd # 直接从数据源构建DataFrame,省去手动维护两个列表的冗余操作 df = pd.DataFrame(payments_sent, columns=['to', 'amount']) df = df.rename(columns={'to': 'To', 'amount': 'Amount'}) # 强制转换Amount为数值类型(关键!否则sum会变成字符串拼接) df['Amount'] = pd.to_numeric(df['Amount']) # 分组聚合+排序:按交易次数降序,次数相同则按金额总和降序 result = df.groupby('To')['Amount'].agg(['count','sum']).reset_index() result = result.sort_values(by=['count', 'sum'], ascending=[False, False]) # 格式化交易次数显示文本 result['count'] = result['count'].astype(str) + ' Transactions' # 给金额总和添加千位分隔符,匹配期望格式 result['sum'] = result['sum'].apply(lambda x: "{:,}".format(x)) # 输出整齐的分组结果 print(result.to_string(index=True, col_space=[5, 15, 20, 15])) # 计算并输出总计 total_transactions = result['count'].str.extract('(\d+)').astype(int).sum().iloc[0] total_amount = df['Amount'].sum() print(f"\nTotal Transactions: {total_transactions} Total Amount: {total_amount:,.7f}")
关键修改说明
- 数值类型转换:用
pd.to_numeric将Amount转为数值,彻底解决字符串拼接求和的问题。 - 排序逻辑:通过
sort_values实现按交易次数从多到少排序,次数相同的按金额总和排序,完全匹配你的期望输出顺序。 - 格式化优化:用千位分隔符美化金额显示,用
to_string调整列宽让输出更规整。 - 总计统计:从交易次数列提取数字求和得到总交易数,直接对原始数据的金额列求和得到总金额,确保统计准确。
最终输出效果
To count sum 0 ABC123ABC 5 Transactions 1,100.0000000 1 123ABC123 3 Transactions 350.0000000 2 XYXY12XYX 2 Transactions 750.0000000 3 1OPR12DRT 1 Transactions 41.0000000 4 199SJFW1K 1 Transactions 100.0000000 5 KSJDHW812 1 Transactions 0.1900000 Total Transactions: 13 Total Amount: 2,341.1900000
内容的提问来源于stack exchange,提问作者errzoned
相关产品推荐
相关产品推荐

