如何用Pandas按月份与类别分组绘制财务数据柱状图
按月份+类别统计财务数据并绘制分组柱状图
问题说明
现有包含日期、类别、金额的财务CSV数据,需要实现:
- 按月份分组,统计每个类别对应的总金额
- 绘制每个月份下不同类别总额的分组柱状图
原代码仅能统计月度总金额,尝试多列分组时因语法错误执行失败。
数据集示例:
Date Category Amount 0 12/29/2022 Food & Drink -28.35 1 12/30/2022 Shopping -12.12 2 11/30/2022 Food & Drink -12.30 3 11/30/2022 gas -12.31 4 10/30/2022 Food & Drink -6.98
初始仅统计月度总额的代码:
df['Transaction Date'] = pd.to_datetime(df['Transaction Date'], format='%m/%d/%Y') df = df.groupby(df['Transaction Date'].dt.month)['Amount'].sum()
失败的多列分组代码(语法错误):
df = df.groupby((df['Transaction Date'].dt.month),['Category'])['Amount'].sum()
解决方案
1. 修正数据分组统计代码
核心问题是多分组键需放入同一个列表中,而非分开作为参数传递。另外注意数据集列名是Date,需和代码中的列名统一:
import pandas as pd # 读取CSV数据(假设文件名为finance_data.csv) df = pd.read_csv('finance_data.csv') # 转换日期格式,提取月份 df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%Y') df['Month'] = df['Date'].dt.month # 新增月份列,方便后续处理 # 按月份+类别分组,统计金额总和 grouped_data = df.groupby(['Month', 'Category'])['Amount'].sum().reset_index() # 可选:将金额转为正数(原数据为支出负数,正数更符合展示逻辑) grouped_data['Amount'] = grouped_data['Amount'].abs()
2. 绘制分组柱状图
直接使用Pandas绘图接口结合Matplotlib实现,将类别作为分组维度:
import matplotlib.pyplot as plt # 将数据转换为宽格式:月份为行,类别为列 pivot_data = grouped_data.pivot(index='Month', columns='Category', values='Amount').fillna(0) # 绘制分组柱状图 pivot_data.plot(kind='bar', figsize=(12, 6), width=0.8) # 设置图表属性 plt.title('月度各类别支出总额', fontsize=14) plt.xlabel('月份', fontsize=12) plt.ylabel('总金额', fontsize=12) plt.xticks(rotation=0) plt.legend(title='类别', bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() plt.show()
代码说明
groupby(['Month', 'Category']):正确的多维度分组方式,先按月份、再按类别聚合reset_index():将分组后的多级索引转为普通列,方便后续透视操作pivot():将长格式数据转为宽格式,让每个类别成为单独的列,适配分组柱状图的绘制- 若原数据中金额为支出(负数),用
abs()转为正数更符合图表展示逻辑
内容的提问来源于stack exchange,提问作者user3324136
相关产品推荐
相关产品推荐

