Pandas进阶指南之数据合并与缺失值处理详解
作者:小庄-Python办公
本节课,我们将学习数据清洗(处理缺失值)、多表关联合并(Python版的VLOOKUP),以及如何用一行代码生成数据透 视表。
数据清洗:处理缺失数据 (NaN)
从系统导出的数据经常会遇到空白单元格,pandas 会将其识别为 NaN (Not a Number)。在分析前,我们必须妥善处理这些空值。
import pandas as pd
df = pd.read_excel("messy_data.xlsx")
# 1. 查看哪些列有缺失值
print(df.isnull().sum())
# 2. 删除含有缺失值的行
# 如果某行只要有空值就整行删除
df_dropped = df.dropna()
# 只有当"销售额"这一列为空时,才删除该行
df_dropped_subset = df.dropna(subset=["销售额"])
# 3. 填充缺失值
# 将所有空值填充为 0
df_filled_0 = df.fillna(0)
# 针对不同列填充不同的值:数值列填0,文本列填"未知"
df_filled = df.fillna({"销售额": 0, "部门": "未知部门"})
多表合并(Merge):碾压 VLOOKUP
在Excel中,如果我们要根据“工号”把两张表的数据匹配到一起,通常会用到 VLOOKUP 公式。如果数据量大,VLOOKUP会非常卡。而在 pandas 中,merge() 函数可以瞬间完成万级数据的匹配。
假设我们有两张表:
df_emp: 包含 [工号, 姓名, 部门ID]df_dept: 包含 [部门ID, 部门名称, 部门负责人]
df_emp = pd.read_excel("employees.xlsx")
df_dept = pd.read_excel("departments.xlsx")
# 使用 merge 进行关联匹配
# on="部门ID" 表示依据这一列进行匹配
# how="left" 表示以左表(df_emp)为基准,找不到的部门信息显示为 NaN
merged_df = pd.merge(df_emp, df_dept, on="部门ID", how="left")
print(merged_df.head())
多表拼接(Concat):上下堆叠数据
每个月你都会收到一份格式相同的月度销售表(1月.xlsx, 2月.xlsx…),你需要把它们汇总成一张年度大表。这时用 concat() 最合适。
df_jan = pd.read_excel("1月销售.xlsx")
df_feb = pd.read_excel("2月销售.xlsx")
# ignore_index=True 表示重新生成行索引(0,1,2...),忽略原来的行号
df_total = pd.concat([df_jan, df_feb], ignore_index=True)
制作数据透 视表(Pivot Table)
Excel 的数据透 视表功能极其强大,而在 pandas 中,同样可以通过 pivot_table 轻松实现。
需求:统计每个城市(行)、每个部门(列)的平均销售额。
# data: 要透 视的 DataFrame
# values: 要计算的数值列
# index: 对应透 视表的“行”标签
# columns: 对应透 视表的“列”标签
# aggfunc: 计算方式(默认是均值 mean,这里我们用 sum 求和)
# fill_value=0: 如果透 视后有空缺,用0填充
pivot = pd.pivot_table(
df,
values="销售额",
index="城市",
columns="部门",
aggfunc="sum",
fill_value=0
)
print(pivot)
# 将透 视表结果保存为Excel
pivot.to_excel("销售数据透 视表.xlsx")将多个 DataFrame 导出到同一个 Excel 的不同 Sheet 页
有时候我们希望把原始数据、汇总数据、透 视表放在同一个 Excel 文件的不同标签页中。
# 使用 ExcelWriter 上下文管理器
with pd.ExcelWriter("最终报告.xlsx") as writer:
df_total.to_excel(writer, sheet_name="全年明细", index=False)
merged_df.to_excel(writer, sheet_name="员工部门信息", index=False)
pivot.to_excel(writer, sheet_name="城市部门透 视表")
print("多Sheet报表导出成功!")知识扩展
在 pandas 中,最核心的数据结构叫做 DataFrame。你可以把它直接想象成 Excel 中的一张二维数据表,有行号(Index)和列名(Columns)。
读取与保存 Excel 数据
pandas 读取和保存数据的代码极其简洁,通常只需要一行代码!
import pandas as pd
# 1. 读取 Excel 文件
# 默认读取第一个 Sheet 页
df = pd.read_excel("sales_data.xlsx")
# 也可以指定读取名为 '2023数据' 的 Sheet
# df = pd.read_excel("sales_data.xlsx", sheet_name="2023数据")
# 查看前5行数据,快速了解数据概况
print(df.head())
# 查看数据的基本信息(行数、列数、数据类型、是否有缺失值)
print(df.info())
# 2. 将 DataFrame 保存为新的 Excel 文件
# index=False 表示不保存最左侧的行索引号
df.to_excel("sales_data_backup.xlsx", index=False)
数据筛选:精准定位你想要的数据
在Excel中,我们通常点击表头上的漏斗图标进行筛选。在 pandas 中,我们通过“条件判断”来实现。
假设我们的表中有:姓名, 部门, 销售额, 城市 等列。
单条件筛选
找出所有“销售部”的员工数据:
sales_dept = df[df["部门"] == "销售部"] print(sales_dept)
找出销售额大于 10000 的记录:
high_sales = df[df["销售额"] > 10000]
多条件筛选
在 pandas 中,& 代表“且”(AND),| 代表“或”(OR)。注意:每个条件必须用括号括起来!
找出“销售部” 且 “销售额大于10000” 的数据:
excellent_sales = df[(df["部门"] == "销售部") & (df["销售额"] > 10000)]
找出在“北京”或“上海”的员工数据:
# 方法一:使用 | bj_sh_staff = df[(df["城市"] == "北京") | (df["城市"] == "上海")] # 方法二:使用 isin() 方法(推荐,更优雅) bj_sh_staff = df[df["城市"].isin(["北京", "上海"])]
数据排序
类似Excel中的升序/降序功能,pandas 使用 sort_values() 方法。
# 按照销售额从高到低排序(降序:ascending=False) sorted_df = df.sort_values(by="销售额", ascending=False) # 多列排序:先按部门升序,部门相同的再按销售额降序 sorted_multi = df.sort_values(by=["部门", "销售额"], ascending=[True, False])
数据分组统计 (GroupBy)
这是数据分析中最常用的功能之一!相当于Excel中简单版的数据透 视表。
需求:统计每个部门的总销售额。
# 按“部门”分组,并对“销售额”求和
dept_sales = df.groupby("部门")["销售额"].sum()
# 重置索引,让结果变成一个漂亮的 DataFrame
dept_sales_df = dept_sales.reset_index()
print(dept_sales_df)
需求:统计每个城市的员工人数、平均销售额。
# 使用 agg 函数进行多种聚合计算
city_stats = df.groupby("城市").agg({
"姓名": "count", # 计数(人数)
"销售额": "mean" # 求平均值
})
# 修改列名以便阅读
city_stats.rename(columns={"姓名": "员工人数", "销售额": "平均销售额"}, inplace=True)
print(city_stats)
小结
通过本节课,你已经掌握了数据分析中最核心的数据清洗、表关联拼接和数据透 视功能。你手头的武器库已经足够应对 80% 的日常数据处理需求了。
最后一节课,我们将结合 os 模块,进行一次酣畅淋漓的实战:一键自动读取上百个Excel文件,处理合并后自动生成带有格式的报表!
到此这篇关于Pandas进阶指南之数据合并、透 视表与缺失值处理详解的文章就介绍到这了,更多相关Pandas数据处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
