Pandas 入门:把 Excel 装进"超级表格"——财务人的数据处理神器
如果说 Python 是一把瑞士军刀,那么 Pandas 就是其中最锋利的那把刀——专门用来切割和处理表格数据。
对于每天和 Excel 打交道的财务人来说,Pandas 的价值可以用一句话概括:它能做 Excel 能做的所有事,还能做 Excel 做不到的事,而且速度快 100 倍。
一、 什么是 Pandas?为什么财务人必须掌握?
Pandas 是 Python 最核心的数据处理库,它的名字来源于 "Panel Data"(面板数据,计量经济学术语)。你不需要理解这个名字的含义,只需要知道:
- • DataFrame 是核心概念: 它就是一个超级增强版的 Excel 表格——有行、有列、有表头,但能装下百万行数据而不卡顿。
- • 生态完善: 几乎所有数据分析相关的 Python 库都以 Pandas 为基础。
Pandas vs Excel 核心对比
二、 第一步:导入与读取数据
在使用 Pandas 之前,需要先导入它(通常简写为 pd):
import pandas as pd
约定俗成: 全世界的 Python 数据分析师都用 pd 作为 Pandas 的别名,保持一致方便阅读别人的代码。
读取 Excel 文件
# 读取一个 Excel 文件
df = pd.read_excel("月度销售报表.xlsx")
# 查看前 5 行数据(快速了解数据长什么样)
print(df.head())
# 查看数据的基本信息
print(df.info())
# 查看数据的统计摘要
print(df.describe())
读取 CSV 文件
# CSV 是最通用的数据交换格式
df = pd.read_csv("导出数据.csv", encoding="utf-8")
编码问题提醒: 如果读取中文 CSV 时出现乱码,尝试 encoding="gbk" 或 encoding="utf-8-sig"。
三、 认识 DataFrame:你的"超级表格"
读取数据后,df 就是一个 DataFrame 对象。让我们来认识它的基本结构:
import pandas as pd
# 手动创建一个简单的 DataFrame(模拟一张费用报销表)
data = {
"姓名": ["张三", "李四", "王五", "赵六", "钱七"],
"部门": ["销售部", "研发部", "销售部", "市场部", "财务部"],
"费用类型": ["差旅费", "办公耗材", "差旅费", "招待费", "培训费"],
"金额": [3500, 1280, 4200, 2800, 1500],
"报销日期": ["2024-03-01", "2024-03-02", "2024-03-03", "2024-03-04", "2024-03-05"]
}
df = pd.DataFrame(data)
print(df)
输出结果:
姓名 部门 费用类型 金额 报销日期
0 张三 销售部 差旅费 3500 2024-03-01
1 李四 研发部 办公耗材 1280 2024-03-02
2 王五 销售部 差旅费 4200 2024-03-03
3 赵六 市场部 招待费 2800 2024-03-04
4 钱七 财务部 培训费 1500 2024-03-05
注意左边的 0, 1, 2... —— 这是 Pandas 自动生成的索引(Index),类似于 Excel 的行号。
四、 核心操作:财务人每天都会用到的功能
1. 选择数据(类似 Excel 的筛选)
# 选择单列(返回 Series)
names = df["姓名"]
print(names)
# 选择多列(返回 DataFrame)
subset = df[["姓名", "部门", "金额"]]
print(subset)
# 按条件筛选:找出金额大于 3000 的记录
high_expense = df[df["金额"] > 3000]
print(high_expense)
# 多条件筛选:销售部的差旅费
result = df[(df["部门"] == "销售部") & (df["费用类型"] == "差旅费")]
print(result)
2. 新增/修改列
# 新增一列:税额(假设税率 10%)
df["税额"] = df["金额"] * 0.10
# 新增一列:含税总额
df["含税总额"] = df["金额"] + df["税额"]
# 修改某一行的值
df.loc[0, "金额"] = 3600# 把张三的金额改为 3600
print(df)
3. 排序
# 按金额从大到小排序
sorted_df = df.sort_values("金额", ascending=False)
print(sorted_df)
# 先按部门排,再按金额排
sorted_df2 = df.sort_values(["部门", "金额"], ascending=[True, False])
4. 基本统计
# 快速统计
print(f"总金额: {df['金额'].sum():,.0f} 元")
print(f"平均金额: {df['金额'].mean():,.0f} 元")
print(f"最大金额: {df['金额'].max():,.0f} 元")
print(f"最小金额: {df['金额'].min():,.0f} 元")
print(f"总记录数: {len(df)} 条")
# 按部门统计金额
dept_total = df.groupby("部门")["金额"].sum()
print("\n=== 各部门费用汇总 ===")
print(dept_total)
五、 导出数据:保存你的处理结果
处理完数据后,你需要把结果保存下来:
# 导出到 Excel
df.to_excel("处理后_费用报表.xlsx", index=False)
# 导出到 CSV
df.to_csv("处理后_费用报表.csv", index=False, encoding="utf-8-sig")
# 参数说明:
# index=False → 不保存索引列(否则会多出一列 0,1,2...)
# encoding="utf-8-sig" → 用 Excel 打开 CSV 时不会乱码
六、 一个完整的实战案例:月度费用分析
下面是一个完整的、可以直接运行的脚本:
import pandas as pd
# ========== 1. 读取数据 ==========
data = {
"日期": ["2024-03-01", "2024-03-02", "2024-03-03", "2024-03-04",
"2024-03-05", "2024-03-08", "2024-03-09", "2024-03-10"],
"部门": ["销售部", "研发部", "销售部", "市场部",
"财务部", "销售部", "研发部", "市场部"],
"费用类型": ["差旅费", "办公耗材", "差旅费", "招待费",
"培训费", "招待费", "设备采购", "广告费"],
"金额": [3500, 1280, 4200, 2800, 1500, 3200, 8900, 5000],
"经手人": ["张三", "李四", "王五", "赵六", "钱七", "张三", "李四", "王五"]
}
df = pd.DataFrame(data)
# ========== 2. 基础分析 ==========
print("=" * 50)
print("📊 3月份费用分析报告")
print("=" * 50)
print(f"\n📌 总费用: {df['金额'].sum():,.0f} 元")
print(f"📌 平均每笔: {df['金额'].mean():,.0f} 元")
print(f"📌 最大单笔: {df['金额'].max():,.0f} 元 ({df[df['金额'] == df['金额'].max']]['经手人'].values[0]})")
print(f"📌 总笔数: {len(df)} 笔")
# ========== 3. 各部门费用排名 ==========
print("\n📋 各部门费用排名:")
dept_ranking = df.groupby("部门")["金额"].sum().sort_values(ascending=False)
for dept, amount in dept_ranking.items():
print(f" {dept}: {amount:,.0f} 元")
# ========== 4. 各费用类型占比 ==========
print("\n📊 费用类型分布:")
type_summary = df.groupby("费用类型")["金额"].sum()
for exp_type, amount in type_summary.items():
pct = amount / df["金额"].sum() * 100
bar = "█" * int(pct / 5) # 简单的柱状图
print(f" {exp_type}: {amount:>8,.0f} 元 ({pct:5.1f}%) {bar}")
# ========== 5. 保存分析结果 ==========
summary = pd.DataFrame({
"指标": ["总费用", "平均每笔", "最大单笔", "总笔数"],
"数值": [df["金额"].sum(), df["金额"].mean(), df["金额"].max(), len(df)]
})
summary.to_excel("3月费用分析摘要.xlsx", index=False)
print("\n✅ 分析报告已保存至: 3月费用分析摘要.xlsx")
七、 避坑指南:Pandas 新手的 5 个常见错误
1. SettingWithCopyWarning 警告
# ❌ 可能触发警告的写法
df[df["金额"] > 3000]["状态"] = "高额"
# ✅ 正确写法:使用 .loc
df.loc[df["金额"] > 3000, "状态"] = "高额"
2. 链式索引(Chained Indexing)
# ❌ 不推荐:链式索引
result = df["部门"]["销售部"]
# ✅ 推荐:使用 .loc
result = df.loc[:, "部门"]
3. 忘记 inplace=True
# 这行代码不会修改原始 df!
df.sort_values("金额") # 返回新对象,原 df 不变
# 需要这样写:
df = df.sort_values("金额") # 重新赋值
# 或者
df.sort_values("金额", inplace=True) # 原地修改
4. 读取文件时路径错误
# ❌ Windows 路径中的反斜杠可能被转义
df = read_excel("C:\data\报表.xlsx") # \t 可能被解释为制表符
# ✅ 使用原始字符串或正斜杠
df = read_excel(r"C:\data\报表.xlsx") # 加 r 前缀
df = read_excel("C:/data/报表.xlsx") # 使用正斜杠
5. 数据类型不匹配
# 读取后检查数据类型
print(df.dtypes)
# 如果"金额"列被读成了字符串(object),需要转换
df["金额"] = pd.to_numeric(df["金额"], errors="coerce")
八、 总结
Pandas 是财务人学习 Python 的绝对核心。今天我们掌握了:
| |
read_excel / read_csv | |
head() / info() | |
| |
groupby().sum() | |
to_excel() | |
记住这个学习原则:不需要背诵所有函数。 当你需要某个功能时,搜索 "pandas + 你的需求",99% 的问题都有现成答案。
下一篇文章,我们将深入 数据清洗——这是财务数据处理中最耗时但也最有价值的环节。