Pandas进阶指南:数据合并、缺失值处理与透视表实战

山海之间
山海之间
发布时间:2026-10-12| 2人浏览过
原创

本文详解Pandas在数据处理中的核心操作,涵盖缺失值(NaN)的检测与填充策略、基于多键的表关联合并(Merge)与纵向拼接(Concat),以及利用透视表进行多维统计。通过具体代码示例,展示如何高效完成数据清洗、多表关联及报表生成,解决日常数据分析中的常见痛点。

数据清洗:处理缺失值 (NaN)

从系统导出的Excel文件中,空白单元格通常被Pandas自动识别为NaN(Not a Number)。在进行任何统计分析前,必须对缺失数据进行预处理,否则可能导致计算错误或模型偏差。

检测与处理策略

首先,通过 isnull().sum() 可以快速定位哪些列包含缺失值及其数量。针对缺失数据,主要有两种处理路径:删除或填充。

若数据集中缺失值占比极小,可直接删除含有空值的行。使用 dropna() 默认删除任何包含NaN的行;若需精准控制,可通过 subset 参数指定仅当特定列(如“销售额”)为空时才执行删除操作。

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=["销售额"])

若需保留样本量,则采用填充策略。使用 fillna() 可将空值替换为指定值。例如,将所有空值统一填充为0;或者针对不同类型的数据列进行差异化填充,如数值型列填0,文本型列(如“部门”)填充为“未知部门”。

# 3. 填充缺失值
# 将所有空值填充为 0
df_filled_0 = df.fillna(0)
# 针对不同列填充不同的值:数值列填0,文本列填"未知"
df_filled = df.fillna({"销售额": 0, "部门": "未知部门"})

多表合并(Merge):高效关联匹配

在Excel中,跨表匹配数据常依赖VLOOKUP函数,但在处理万级甚至百万级数据时,该操作极易导致软件卡顿。Pandas的 merge() 函数通过底层优化,可瞬间完成大规模数据的关联匹配。

假设拥有两张表:df_emp(包含工号、姓名、部门ID)和 df_dept(包含部门ID、部门名称、部门负责人)。我们需要根据“部门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())

上述代码中,how="left" 指定了左连接策略,即以员工表为基准,保留所有员工记录,即使某些员工没有对应的部门信息(此时部门字段显示为NaN)。其他连接方式还包括内连接(inner)、右连接(right)和全外连接(outer),可根据业务需求灵活选择。

多表拼接(Concat):纵向堆叠数据

当面临格式相同的月度销售报表(如1月、2月数据)需要汇总为年度总表时,使用 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)

通过设置 ignore_index=True,Pandas会自动重置索引,生成从0开始的连续整数索引,避免原始数据中残留的索引号造成后续处理的混乱。

制作数据透视表(Pivot Table)

Pandas提供了强大的 pivot_table() 函数,可轻松实现类似Excel数据透视表的多维统计功能。该函数允许指定数值列、行标签、列标签以及聚合函数。

例如,统计每个城市在不同部门的销售额总和:

# 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")

在此示例中,index="城市" 定义了透视表的行维度,columns="部门" 定义了列维度,aggfunc="sum" 指定了聚合方式为求和。若透视后存在空缺值,fill_value=0 会将其填充为0,确保数据完整性。

多Sheet报表导出

在实际工作中,通常需要将原始明细、汇总数据及透视结果整合到同一个Excel文件的不同Sheet页中。利用 ExcelWriter 上下文管理器,可以一次性完成多表导出。

# 使用 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报表导出成功!")

通过指定 sheet_name 参数,可将不同的DataFrame写入对应的Sheet页。设置 index=False 可避免将行索引号写入Excel,使报表更加整洁。

知识扩展:基础操作与筛选

Pandas的核心数据结构是DataFrame,可视为带有行索引(Index)和列名(Columns)的二维表格。掌握以下基础操作,可应对80%的日常数据处理需求。

数据读取与保存

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)

条件筛选

利用布尔索引可实现灵活的数据筛选。单条件筛选如找出“销售部”员工或“销售额”大于10000的记录:

sales_dept = df[df["部门"] == "销售部"]
print(sales_dept)

high_sales = df[df["销售额"] > 10000]

多条件筛选需使用 &(且/AND)和 |(或/OR)运算符,且每个条件必须用括号括起来:

excellent_sales = df[(df["部门"] == "销售部") & (df["销售额"] > 10000)]

# 方法一:使用 |
bj_sh_staff = df[(df["城市"] == "北京") | (df["城市"] == "上海")]

# 方法二:使用 isin() 方法(推荐,更优雅)
bj_sh_staff = df[df["城市"].isin(["北京", "上海"])]

排序与分组聚合

使用 sort_values() 可按指定列排序,支持单列或多列排序,并可指定升序(ascending=True)或降序(ascending=False):

# 按照销售额从高到低排序(降序: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() 函数可进行多种聚合计算,如同时统计人数和平均销售额:

# 使用 agg 函数进行多种聚合计算
city_stats = df.groupby("城市").agg({
    "姓名": "count",       # 计数(人数)
    "销售额": "mean"       # 求平均值
})
# 修改列名以便阅读
city_stats.rename(columns={"姓名": "员工人数", "销售额": "平均销售额"}, inplace=True)
print(city_stats)

小结

通过本文,我们掌握了Pandas在数据清洗、多表关联、纵向拼接及透视表生成方面的核心功能。这些工具构成了数据分析的“武器库”,足以应对绝大多数日常数据处理场景。后续可结合 os 模块进行实战,实现一键自动读取上百个Excel文件,并自动生成带有格式的报表,进一步提升数据处理效率。

以上就是Pandas进阶指南之数据合并与缺失值处理的详细内容,更多关于Python数据分析的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。