- 摘要:每月账单一堆数字,根本看不出钱花哪了?用 Python 的 pandas 和 matplotlib,不到 10 行就能把 CSV 变成一眼看懂的柱状图和饼图。附完整可运行代码和中文乱码等常见坑的解决办法,零基础也能照着跑。
---
你是不是也这样看账单
每到月底,打开支付宝或微信的账单导出,密密麻麻几百行。餐饮、交通、购物、娱乐……数字一大片,眼睛都看花了,还是不知道钱到底溜去哪了。
有人会把这些数据粘进 Excel,再手动插入图表。可光是选中区域、调格式、改颜色,就够折腾半天,最后还不一定好看。
其实这事用 Python 干最合适。你只需要把账单存成一个 CSV 文件,写几行代码,它就能帮你算出每个品类花了多少,再自动画出柱状图和饼图。喝口水的功夫,账单一目了然。
你可能会想:「我没学过编程,这能行吗?」放心,这篇文章里的代码是完整的,直接复制就能跑,不需要你理解每一行的意思。跑通之后,你再慢慢琢磨也不迟。
先搞懂三件事
数据分析听起来吓人,拆开就三步:
- 读数据:把 CSV 文件读进来,变成 Python 能处理的结构。
- 算总数:按品类把金额加起来,看看谁最烧钱。
- 画图:把算出来的数字变成图表,肉眼直接看。
负责读数据和算总数的库叫 pandas,画图的是 matplotlib。这俩是 Python 数据圈最标配的组合,学会了能应付大部分日常分析。
装它们只要一行命令。打开终端(Windows 叫命令提示符,Mac 叫终端),输入:
pip install pandas matplotlib
等它跑完,环境就齐了。要是提示 pip 找不到,多半是 Python 没装好,先去 Python 官网下个安装包,记得勾上「Add to PATH」。
准备一份账单数据
为了让你马上能跑,我写了段代码,自动生成一份示例账单。你不用自己准备任何文件,复制就能用。
等跑通了,你只要把 账单.csv 换成自己导出的真实账单(列名改成「日期、品类、金额」就行),后面的分析一行都不用改。
import csv
# 一份示例账单:日期 / 品类 / 金额
sample = [
["日期", "品类", "金额"],
["2026-08-01", "餐饮", 38],
["2026-08-02", "交通", 12],
["2026-08-03", "餐饮", 56],
["2026-08-05", "购物", 199],
["2026-08-07", "餐饮", 45],
["2026-08-09", "交通", 18],
["2026-08-12", "娱乐", 88],
["2026-08-15", "餐饮", 62],
["2026-08-18", "购物", 320],
["2026-08-20", "交通", 15],
["2026-08-22", "娱乐", 45],
]
with open("账单.csv", "w", newline="", encoding="utf-8") as f:
csv.writer(f).writerows(sample)
print("示例账单已生成:账单.csv")
运行后,你的文件夹里就会多出一个 账单.csv。打开看看,就是一张规规矩矩的表格。
读进来,算一算
下面这段代码把 CSV 读进来,顺便告诉你这个月一共花了多少。
import pandas as pd
df = pd.read_csv("账单.csv")
print(df)
print("这个月一共花了:", df["金额"].sum(), "元")
pd.read_csv 是 pandas 的读表函数,读进来的是一个叫 DataFrame 的表格对象。后面那个 df["金额"].sum(),意思就是「把『金额』这一列全部加起来」。
接着,按品类汇总:
cat = df.groupby("品类")["金额"].sum().sort_values(ascending=False)
print(cat)
groupby("品类") 是按品类分组,["金额"].sum() 是把每组的金额加总,sort_values(ascending=False) 是从多到少排个序。跑出来你会看到类似这样的结果:
品类
购物 519
餐饮 201
娱乐 133
交通 45
这下清楚了:这个月最爱花钱的居然是「购物」。
画图才是重头戏
数字还是有点干,画成图才带感。先来一张柱状图:
import matplotlib.pyplot as plt
# 解决中文显示成方块的问题(下一节细说)
plt.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei", "PingFang SC"]
plt.rcParams["axes.unicode_minus"] = False
plt.figure(figsize=(7, 4))
plt.bar(cat.index, cat.values, color="#07c160")
plt.title("本月各品类支出")
plt.xlabel("品类")
plt.ylabel("金额(元)")
plt.tight_layout()
plt.savefig("支出柱状图.png", dpi=120)
plt.show()
plt.bar 就是画柱状图,color="#07c160" 是微信绿,看着舒服。plt.savefig 会把图存成图片文件,plt.show() 则直接弹窗给你看。
再来一张饼图,看看每个品类占总支出的比例:
plt.figure(figsize=(6, 6))
plt.pie(cat.values, labels=cat.index, autopct="%.1f%%",
colors=["#07c160", "#56ccf2", "#f2994a", "#eb5757"])
plt.title("支出占比")
plt.savefig("支出饼图.png", dpi=120)
plt.show()
autopct="%.1f%%" 会在每块饼上标出百分比。跑完,两张图就躺在你的文件夹里了。是不是比对着数字发呆爽多了?
常见问题,先帮你踩坑
图里的中文变成方块了?
这是 matplotlib 找不到中文字体。上面那两行 rcParams 已经按常见字体名排了优先级,大多数电脑能直接解决。要是还不行,Windows 把 SimHei 换成 Microsoft YaHei,Mac 换成 PingFang SC 试试。
图片一闪而过,没保存?
弹窗关掉后图就没了,但 plt.savefig 已经帮你存成 PNG 了,去文件夹里找 支出柱状图.png 和 支出饼图.png 就行。
自己的 CSV 读不进来?
多半是编码问题。微信或支付宝导出的文件有时是 gbk 编码,这时把读表那行改成 pd.read_csv("账单.csv", encoding="gbk")。
我根本没有账单数据?
先用文章里的示例账单跑通流程,有感觉了再去导自己的。别卡在「没数据」这一步,动手比完美重要。
品类那一列叫别的名字?
比如叫「类型」。那所有用到 "品类" 的地方,改成你的列名 "类型" 即可,逻辑一模一样。
把上面的拼成一份完整脚本
贴心的我把前面所有步骤合成了一个文件。你新建一个 analysis.py,把下面这些一次性粘进去,运行就能出全部结果和图表:
import csv
import pandas as pd
import matplotlib.pyplot as plt
# ---- 第 1 步:准备数据(自动生成示例;你换成自己的 CSV 即可)----
sample = [
["日期", "品类", "金额"],
["2026-08-01", "餐饮", 38],
["2026-08-02", "交通", 12],
["2026-08-03", "餐饮", 56],
["2026-08-05", "购物", 199],
["2026-08-07", "餐饮", 45],
["2026-08-09", "交通", 18],
["2026-08-12", "娱乐", 88],
["2026-08-15", "餐饮", 62],
["2026-08-18", "购物", 320],
["2026-08-20", "交通", 15],
["2026-08-22", "娱乐", 45],
]
with open("账单.csv", "w", newline="", encoding="utf-8") as f:
csv.writer(f).writerows(sample)
print("示例账单已生成:账单.csv")
# ---- 第 2 步:读数据 ----
df = pd.read_csv("账单.csv")
print(df)
print("这个月一共花了:", df["金额"].sum(), "元")
# ---- 第 3 步:按品类汇总 ----
cat = df.groupby("品类")["金额"].sum().sort_values(ascending=False)
print(cat)
# ---- 第 4 步:画图(解决中文乱码)----
plt.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei", "PingFang SC"]
plt.rcParams["axes.unicode_minus"] = False
plt.figure(figsize=(7, 4))
plt.bar(cat.index, cat.values, color="#07c160")
plt.title("本月各品类支出")
plt.xlabel("品类")
plt.ylabel("金额(元)")
plt.tight_layout()
plt.savefig("支出柱状图.png", dpi=120)
plt.show()
plt.figure(figsize=(6, 6))
plt.pie(cat.values, labels=cat.index, autopct="%.1f%%",
colors=["#07c160", "#56ccf2", "#f2994a", "#eb5777"])
plt.title("支出占比")
plt.savefig("支出饼图.png", dpi=120)
plt.show()
print("图表已保存:支出柱状图.png / 支出饼图.png")
写在最后
你看,数据分析没那么玄乎。读表、汇总、画图,三步就完事。今天你拿示例账单跑通了,明天就能把上个月的真实账单导出来,看看钱到底溜去了哪个无底洞。
我自己的体会是:第一次画出那张饼图时,才发现「娱乐」花得比想象中多得多。这种「看见自己」的感觉,正是学编程最有意思的地方。
你打算拿什么数据练手?账单、运动记录、还是读书清单?欢迎在评论区聊聊,下次我教你用 Python 做更复杂的可视化。