如何在Pandas分组后保持MMM-YY顺序并按Expense字母排序
按指定分组规则聚合支出数据并排序
前置数据处理代码
import numpy as np import pandas as pd d1 = pd.DataFrame({"Date" : ['1/1/2022', '12/15/2010', '6/1/2015', '1/31/2022', '12/31/2010', '3/10/2009', '1/7/2022', '12/9/2010','12/20/2010','1/13/2022'], "Expense": ['Food', 'Food', 'Gasoline', 'Coffee', 'Coffee', 'PayPal', 'Gasoline', 'Gasoline','Gasoline','Coffee'], "Total": [3.89, 7.00, 11, 0.99, 8.01, 99, 76, 50,48,9]}) # 将Date列转为datetime类型 d1['Date'] = pd.to_datetime(d1['Date']) # 从Date列生成MMM-YY列 d1['MMM-YY'] = d1['Date'].dt.strftime('%b') + '-' + d1['Date'].dt.strftime('%y') # 按Date列对DataFrame排序 d1.sort_values('Date', inplace=True)
处理后的数据
Date Expense Total MMM-YY 5 2009-03-10 PayPal 99.00 Mar-09 7 2010-12-09 Gasoline 50.00 Dec-10 1 2010-12-15 Food 7.00 Dec-10 8 2010-12-20 Gasoline 48.00 Dec-10 4 2010-12-31 Coffee 8.01 Dec-10 2 2015-06-01 Gasoline 11.00 Jun-15 0 2022-01-01 Food 3.89 Jan-22 6 2022-01-07 Gasoline 76.00 Jan-22 9 2022-01-13 Coffee 9.00 Jan-22 3 2022-01-31 Coffee 0.99 Jan-22
需求描述
需要按MMM-YY(月份)和Expense(支出类型)分组,对Total列求和,核心要求:
- 保持
MMM-YY列的升序排列(与处理后的d1一致) - 每个
MMM-YY分组内的Expense按字母顺序排序
解决方案
要实现需求,关键是让MMM-YY保留原时间顺序(而非字符串默认排序),同时在分组内对Expense按字母排序:
# 提取MMM-YY的有序类别,保留原时间排序 mmm_yy_order = d1['MMM-YY'].unique() d1['MMM-YY'] = pd.Categorical(d1['MMM-YY'], categories=mmm_yy_order, ordered=True) # 按MMM-YY和Expense分组求和 agg_result = d1.groupby(['MMM-YY', 'Expense'], as_index=False)['Total'].sum() # 按MMM-YY(有序类别)和Expense字母顺序排序 agg_result = agg_result.sort_values(['MMM-YY', 'Expense']) # 设置多级索引并格式化输出,匹配期望样式 agg_result = agg_result.set_index(['MMM-YY', 'Expense']) agg_result['Total'] = agg_result['Total'].round(2) print(agg_result.to_string())
输出结果
Total MMM-YY Expense Mar-09 PayPal 99.00 Dec-10 Coffee 8.01 Food 7.00 Gasoline 98.00 Jun-15 Gasoline 11.00 Jan-22 Coffee 9.99 Food 3.89 Gasoline 76.00
内容的提问来源于stack exchange,提问作者user603535
相关产品推荐
相关产品推荐

