Python绘制各部门月度费用支出图:如何将统计发票频次改为统计金额总和
修改方案
你只需要做三处核心修改即可实现需求:
- 先转换金额字段的格式,从字符串转成可计算的数值类型
- 把分组统计的计数逻辑替换为金额求和逻辑
- 修改图表Y轴标签适配金额统计的场景
1. 金额字段格式转换
原数据中Beløb(发票金额)是带千位分隔符、逗号作为小数位的字符串格式,无法直接求和,需要先做格式转换:
# 该代码需要放在数据筛选逻辑之前执行 df['Beløb'] = df['Beløb'].str.replace('.', '', regex=False).str.replace(',', '.', regex=False).astype(float)
2. 替换分组统计逻辑
原代码中.size()是统计分组内的条目数(即你现在得到的频次),替换为对Beløb字段求和即可:
# 把原来的plot_df生成逻辑替换为下面的代码 plot_df = ( df.groupby([pd.Grouper(key='Udstedelsesdato',freq='M'), 'OrganisationNiveau3']) .agg(total_amount=('Beløb', 'sum')) .reset_index() .pivot(index='Udstedelsesdato', columns='OrganisationNiveau3', values='total_amount') )
3. 调整图表标签
把Y轴标签从频次修改为金额相关描述即可:
# 把原来的绘图代码行替换为下面的代码 ax = plot_df.plot(kind='bar', rot=0, ylabel='发票总金额', xlabel ='月份')
完整修改后代码
import pandas as pd import matplotlib.pyplot as plt import matplotlib.ticker as ticker # 转换日期格式 df['Udstedelsesdato'] = pd.to_datetime(df['Udstedelsesdato']) # 转换金额格式 df['Beløb'] = df['Beløb'].str.replace('.', '', regex=False).str.replace(',', '.', regex=False).astype(float) # 筛选2019年数据+指定部门 df = df[(df['Udstedelsesdato'].dt.year == 2019)] df = df[df.OrganisationNiveau3 != 'Direktionen , Fælles område'] df = df[df.OrganisationNiveau3 != 'Kommunaldirektørens Stabe'] df = df[df.OrganisationNiveau3 != 'Kultur og Erhverv'] df = df[df.OrganisationNiveau3 != 'Økonomi'] # 按月份+部门分组统计总金额 plot_df = ( df.groupby([pd.Grouper(key='Udstedelsesdato',freq='M'), 'OrganisationNiveau3']) .agg(total_amount=('Beløb', 'sum')) .reset_index() .pivot(index='Udstedelsesdato', columns='OrganisationNiveau3', values='total_amount') ) # 绘制柱状图 ax = plot_df.plot(kind='bar', rot=0, ylabel='发票总金额', xlabel ='月份') # 格式化X轴刻度 ax.xaxis.set_major_formatter( ticker.FixedFormatter(plot_df.index.strftime('%d-%m')) ) plt.rcParams.update({'font.size': 40}) plt.rcParams["figure.figsize"]=(50,50) plt.show()
内容的提问来源于stack exchange,提问作者Mads Finnerup
相关产品推荐
相关产品推荐

