为什么是 Pandas
处理表格数据,Excel 能做的事 Pandas 都能做,而且:
- 快:几十万行数据秒级处理,Excel 早就卡死
- 可复现:代码写一次,下个月的新数据重新跑一遍就行
- 可串联:读数据 → 清洗 → 分析 → 出图一条龙
pip install pandas openpyxl # openpyxl 用于读写 Excel
准备演示数据
后面的例子都用这份「销售数据」:
import pandas as pd
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五", "张三", "李四", "赵六"],
"部门": ["华东", "华北", "华东", "华东", "华北", "华南"],
"销售额": [12000, 8500, 15000, 13500, None, 9000],
"入职日期": ["2023-01-15", "2023-03-20", "2022-11-05",
"2023-01-15", "2023-03-20", "2024-02-01"],
})
操作 1:读写 CSV / Excel
# 读取
df = pd.read_csv("sales.csv") # CSV
df = pd.read_excel("sales.xlsx", sheet_name="1月") # Excel 指定工作表
# 中文乱码?指定编码
df = pd.read_csv("sales.csv", encoding="gbk")
# 保存(index=False 去掉行号,utf-8-sig 保证 Excel 打开不乱码)
df.to_csv("output.csv", index=False, encoding="utf-8-sig")
df.to_excel("output.xlsx", index=False)
操作 2:快速查看数据
拿到任何数据,先做这四个动作:
df.head() # 前 5 行长什么样
df.info() # 每列的类型、有没有缺失
df.describe() # 数值列的统计:均值/最值/分位数
df.shape # 几行几列
操作 3:选列与筛选行
# 选列
df["销售额"] # 单列(Series)
df[["姓名", "销售额"]] # 多列(DataFrame)
# 条件筛选(最常用的操作,没有之一)
df[df["销售额"] > 10000]
df[df["部门"] == "华东"]
df[(df["销售额"] > 10000) & (df["部门"] == "华东")] # 多条件用 & |,必须加括号
# 模糊匹配
df[df["姓名"].str.contains("张")]
# 在列表内匹配
df[df["部门"].isin(["华东", "华南"])]
操作 4:排序与去重
# 排序
df.sort_values("销售额", ascending=False) # 按销售额降序
df.sort_values(["部门", "销售额"], ascending=[True, False]) # 先部门升序再销售额降序
# 去重
df.drop_duplicates() # 整行重复才删
df.drop_duplicates(subset=["姓名"]) # 同一人只留一条
df.drop_duplicates(subset=["姓名"], keep="last") # 留最后一次出现的
操作 5:缺失值处理
# 查看缺失情况
df.isna().sum() # 每列有几个缺失
# 处理:三选一
df.dropna() # 1. 删掉含缺失的行
df["销售额"].fillna(0) # 2. 填固定值
df["销售额"].fillna(df["销售额"].mean()) # 3. 填均值(数值列常用)
操作 6:分组聚合(groupby,核心中的核心)
「按部门统计销售额」这类需求的标准答案:
# 按部门分组,算销售额总和
df.groupby("部门")["销售额"].sum()
# 一次算多个统计量
df.groupby("部门")["销售额"].agg(["sum", "mean", "count"])
# 多列分组 + 不同列不同聚合
df.groupby("部门").agg(
总销售额=("销售额", "sum"),
人均销售额=("销售额", "mean"),
人数=("姓名", "count"),
).reset_index() # 把分组键变回普通列,方便后续处理
操作 7:新增计算列
# 直接运算
df["提成"] = df["销售额"] * 0.05
# 条件赋值:销售额过万的标记为「高」
import numpy as np
df["等级"] = np.where(df["销售额"] > 10000, "高", "普通")
# 对文本列做处理
df["姓名长度"] = df["姓名"].str.len()
操作 8:表合并(merge 与 concat)
# concat:上下堆叠(合并多个月份的同结构表格)
df_all = pd.concat([df_1月, df_2月, df_3月], ignore_index=True)
# merge:左右拼接(类似 SQL 的 JOIN)
df_员工 = pd.DataFrame({"姓名": ["张三", "李四"], "职级": ["P5", "P6"]})
df.merge(df_员工, on="姓名", how="left") # 左连接:保留左表全部行
how 的四种取值:left(保留左表)、right、inner(交集)、outer(并集)。日常 90% 用 left。
操作 9:日期处理
# 字符串转日期
df["入职日期"] = pd.to_datetime(df["入职日期"])
# 提取年/月/星期几
df["入职年"] = df["入职日期"].dt.year
df["入职月"] = df["入职日期"].dt.month
# 按月统计
df.groupby(df["入职日期"].dt.to_period("M"))["销售额"].sum()
# 日期差(算工龄)
df["工龄天数"] = (pd.Timestamp.now() - df["入职日期"]).dt.days
操作 10:透视表(pivot_table)
Excel 透视表的代码版,多维交叉统计一把梭:
# 行=部门,列=等级,值=销售额总和
df.pivot_table(
index="部门",
columns="等级",
values="销售额",
aggfunc="sum",
fill_value=0, # 空位填 0
margins=True, # 加合计行列
)
避坑指南
1. SettingWithCopyWarning 警告
# 错误:先筛选再赋值,改的可能不是原表
df[df["部门"] == "华东"]["销售额"] = 0
# 正确:用 loc 一步定位
df.loc[df["部门"] == "华东", "销售额"] = 0
2. 链式赋值结果没生效
Pandas 很多操作返回新对象而不改原表。要么接返回值:
df = df.dropna() # 接返回值
# 或者
df.dropna(inplace=True) # 用 inplace 参数
3. 数字被读成字符串
CSV 里带「¥」「,」的数字会被当成文本,先清洗再计算:
df["销售额"] = df["销售额"].str.replace("¥", "").str.replace(",", "").astype(float)
写在最后
Pandas 的学习曲线不在语法而在思维转换:别写 for 循环逐行处理,学会用「向量化」的批量操作。遇到需求先问自己——这能不能用筛选、分组、合并这三板斧解决?90% 的情况答案是能。







评论 (0)
还没有评论,快来抢沙发吧~