Python Pandas 从基础操作到高级处理实战指南

陆景行
陆景行
发布时间:2026-10-10| 2人浏览过
原创

本文详细拆解 Python Pandas 库的核心数据结构与完整数据处理流程。涵盖 DataFrame 创建、CSV 读取、位置与标签索引、GroupBy 分组聚合、向量化运算、数据合并(Merge)、透视表分析及时间序列处理等关键操作,并提供分块读取与类型优化等大数据场景下的性能调优方案。通过可直接运行的代码示例,帮助开发者高效掌握结构化数据的清洗、转换与分析方法。

Pandas 核心数据结构与快速构建

Pandas 是 Python 数据科学领域的核心库,专为处理结构化数据而设计。其提供了两种核心数据结构:Series(一维数组)和 DataFrame(二维表格),支持高效的数据操作、清洗和分析。主要优势包括灵活的数据清洗与转换功能、强大的分组聚合能力,以及与 NumPy、Matplotlib 等科学计算库的无缝对接。

import pandas as pd
import numpy as np

# 创建 Series(一维数据结构)
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print("Series 示例:")
print(s)

# 创建 DataFrame(二维表格)
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'City': ['New York', 'London', 'Paris']
})
print("\nDataFrame 示例:")
print(df)

执行后控制台将分别输出包含浮点型数据(含 NaN)的一维 Series,以及包含姓名、年龄、城市三列初始结构的 DataFrame 表格。

数据处理的实际执行步骤

第1步:导入外部文件与基础探查

目的:确认数据来源并快速获取行数、列名、数据类型及统计摘要,为后续清洗提供基准。

# 构造示例数据并保存
# data = {...}  # 此处省略字典定义
df = pd.DataFrame(data)
df.to_csv('sample_data.csv', index=False)

# 从 CSV 读取数据
df = pd.read_csv('sample_data.csv')

# 查看基本信息、前几行、统计摘要与形状
print("数据基本信息:")
df.info()
print("\n数据前 5 行:")
print(df.head())
print("\n数据统计摘要:")
print(df.describe())
rows, columns = df.shape
print(f"\n数据形状: {rows}行{columns}列")

完成状态:成功加载 sample_data.csv,通过 info() 确认各列 Non-Null Count 与 Dtype,describe() 输出 Age 与 Salary 的均值、标准差及四分位数,确认 DataFrame 为 5行4列 格式。

第2步:使用多重条件精准定位数据

目的:根据业务需求提取特定行或组合条件数据,避免全量扫描降低效率。

# 位置索引 (iloc)
print("第一行数据 (iloc[0]):")
print(df.iloc[0])
print("\n前两行数据 (iloc[:2]):")
print(df.iloc[:2])

# 标签索引 (loc)
df.set_index('Name', inplace=True)
print("\n以 Name 为索引后,查询 Alice 的记录 (loc['Alice']):")
print(df.loc['Alice'])

# 布尔索引与组合条件
print("\n年龄大于 30 的记录:")
print(df[df['Age'] > 30])
print("\n查询 New York 的高收入人群 (Salary > 5000):")
print(df[(df['City'] == 'New York') & (df['Salary'] > 5000)])

完成状态:iloc 返回基于整数位置的切片;set_index 成功后,loc['Alice'] 准确返回对应行的对象记录;布尔掩码正确过滤出 Charlie 及 David 的记录。

第3步:执行分组聚合与多维透视

目的:按指定维度对数据进行统计汇总,支持自定义函数与多层级交叉分析。

# 单列分组求均值
city_age_mean = df.groupby('City')['Age'].mean()
print("各城市平均年龄:")
print(city_age_mean)

# 多列分组并应用多个聚合函数
grouped = df.groupby(['City', 'Age']).agg({'Salary': ['mean', 'sum']})
print("\n按城市和年龄分组后的薪资统计:")
print(grouped)

# 分组后筛选(仅保留平均薪资大于 5500 的城市记录)
filtered_groups = df.groupby('City').filter(lambda x: x['Salary'].mean() > 5500)
print("\n平均薪资大于 5500 的城市记录:")
print(filtered_groups)

# 分组后应用自定义极差函数
def salary_range(x):
    return x.max() - x.min()
city_salary_range = df.groupby('City')['Salary'].apply(salary_range)
print("\n各城市薪资范围:")
print(city_salary_range)

完成状态:控制台输出 Berlin、London、New York、Paris 的平均年龄;多层级分组生成复合索引 DataFrame;filter 仅保留 Bob 与 Charlie 所在城市的记录;极差函数正确计算各组最大最小值差。

第4步:调整数据框结构与合并关联表

目的:完成字段的动态增删、数值计算及跨表数据关联。

# 添加新列(年龄段分类)
df['Age_Category'] = pd.cut(df['Age'], bins=[20, 25, 30, 35, 40], 
                           labels=['Young', 'Early Career', 'Mid Career', 'Senior'])
print("添加年龄段分类后的数据集:")
print(df)

# 删除指定列
df.drop('Age', axis=1, inplace=True)
print("\n删除 Age 列后的数据集:")
print(df)

# 条件修改数值(New York 薪资提高 5%)
df.loc[df['City'] == 'New York', 'Salary'] *= 1.05
print("\n调整 New York 薪资后的数据集:")
print(df)

# 插入新行(使用 concat 替代已废弃的 append)
new_row = pd.DataFrame({
    'Name': ['Frank'],
    'City': ['Sydney'],
    'Salary': [6500],
    'Annual_Salary': [6500*12],
    'Age_Category': ['Mid Career']
}, index=['Frank'])
df = pd.concat([df, new_row])
print("\n插入新行后的数据集:")
print(df)

# 内连接 / 左连接 / 右连接 / 全连接
# 预置 df2 用于演示
df2 = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie', 'Frank'],
                    'Department': ['Engineering', 'Marketing', 'Engineering', 'HR']})
print("\n内连接结果:")
print(pd.merge(df, df2, on='Name', how='inner'))
print("\n左连接结果:")
print(pd.merge(df, df2, on='Name', how='left'))
print("\n右连接结果:")
print(pd.merge(df, df2, on='Name', how='right'))
print("\n全连接结果:")
print(pd.merge(df, df2, on='Name', how='outer'))

完成状态:pd.cut 成功划分年龄段;drop 移除冗余列;.loc[] 精准更新指定城市薪资;pd.concat 安全追加行;四种 how 模式验证了内外键匹配逻辑,NaN 占位符正确显示缺失关联。

第5步:解析时间序列并计算增长差异

目的:将字符串日期转化为时序对象,提取年月日特征,执行重采样滚动计算。

# 创建带时间序列的数据
dates = pd.date_range(start='2023-01-01', periods=6, freq='M')
ts_df = pd.DataFrame({'Date': dates, 'Sales': [100, 120, 110, 130, 140, 150]})
ts_df['Date'] = pd.to_datetime(ts_df['Date'])

# 提取时间特征
ts_df['Year'] = ts_df['Date'].dt.year
ts_df['Month'] = ts_df['Date'].dt.month
ts_df['Quarter'] = ts_df['Date'].dt.quarter
print("添加时间特征后:")
print(ts_df)

# 时间序列重采样(按季度聚合)
ts_df.set_index('Date', inplace=True)
quarterly_sales = ts_df.resample('Q').sum()
print("\n按季度聚合的销售数据:")
print(quarterly_sales)

# 计算环比增长
ts_df['Previous_Sales'] = ts_df['Sales'].shift(1)
ts_df['Sales_Growth'] = ts_df['Sales'] - ts_df['Previous_Sales']
print("\n添加销售增长数据后:")
print(ts_df)

完成状态:freq='M' 生成月末日期序列;.dt. 访问器成功拆分年、月、季属性;resample('Q') 将月度数据压缩至季度总和;shift(1) 与差分运算准确计算出首行为 NaN 后的逐期增长量。

第6步:应对大数据量的内存与性能优化

目的:当数据超出单机内存限制或字段类型冗余时,采用分块读取与类型降级策略保障稳定运行。

# 分块读取大文件示例
def process_chunk(chunk):
    return chunk.groupby('City')['Salary'].mean()

results = []
for chunk in pd.read_csv('sample_data.csv', chunksize=2):
    results.append(process_chunk(chunk))
final_result = pd.concat(results)
print("分块处理结果:")
print(final_result)

# 优化数据类型以减少内存占用
df['Salary'] = df['Salary'].astype('int32')
print("\n优化数据类型后内存使用:")
df.info()

# 使用 category 类型处理低基数分类数据
df['City'] = df['City'].astype('category')
print("\n使用 category 类型后内存使用:")
df.info()

# 稀疏数据处理(新版推荐使用 SparseDtype)
sparse_data = pd.Series([0, 0, 0, 5, 0, 0, 10, 0], dtype='Sparse[int]')
print("\n稀疏数据示例:")
print(sparse_data)

完成状态:chunksize 循环避免一次性载入大文件;astype('int32') 与 'category' 显著降低 DataFrame 内存峰值;稀疏数组正确压缩零值存储结构。

常用函数速查与版本兼容性说明

1. 数据结构与输入输出

  • pd.Series(data) / pd.DataFrame(data):构建一维/二维对象
  • pd.read_csv(filepath) / pd.read_excel(filepath):导入主流格式
  • pd.date_range(start, periods, freq):生成连续日期区间

2. 数据探查与方法

  • df.info() / df.describe():核对元数据与数值分布
  • df.head(n) / df.tail(n):预览样本切片
  • df.shape / df.reset_index():获取维度与重置主键

3. 索引过滤与聚合透视

  • df.iloc[] / df.loc[] / df[condition]:位置、标签与布尔检索
  • df.groupby(col) / grouped.agg(func) / grouped.filter(func):分组归类统计
  • df.pivot_table(index, columns, values):多维交叉分析表

4. 结构调整与时间周期

  • df.drop(col, axis=1) / df.rename(columns={}) / pd.concat([df1, df2]):行列维护
  • pd.merge(df1, df2, on=col, how='') / df.join(df2):表连接
  • pd.to_datetime(col) / df.resample(freq) / df.shift(n) / df.diff():时序流转计算

以上就是 Python 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 算法库。