当前位置:首页 > Python > 正文内容

Python 数据处理实战:从零开始掌握 Pandas 核心操作

admin5小时前Python2

在现代数据驱动的世界中,处理和分析结构化数据已成为必备技能。无论你是数据分析师、机器学习工程师还是科研人员,Pandas 都是你工具箱中不可或缺的利器。与 Excel 相比,Pandas 能够轻松处理百万级行的数据集,并且支持自动化处理流程。

让我们从一个实际的业务场景开始。假设你是一家电商公司的数据分析师,需要处理包含用户订单信息的 CSV 文件。首先,我们需要导入 Pandas 库并读取数据:

```python import pandas as pd import numpy as np # 创建示例数据 data = { 'order_id': [1001, 1002, 1003, 1004, 1005], 'user_id': [101, 102, 103, 104, 105], 'product_name': ['笔记本电脑', '无线鼠标', '机械键盘', '显示器', '耳机'], 'price': [5999.00, 129.00, 399.00, 2499.00, 299.00], 'quantity': [1, 2, 1, 1, 3], 'order_date': ['2026-03-15', '2026-03-16', '2026-03-16', '2026-03-17', '2026-03-17'], 'status': ['已发货', '已完成', '已发货', '处理中', '已完成'] } df = pd.DataFrame(data) print("原始数据:") print(df) ```

通过上述代码,我们成功创建了一个包含订单信息的 DataFrame。DataFrame 是 Pandas 中最核心的数据结构,可以理解为类似 Excel 表格的二维数据容器。现在让我们深入了解数据的基本情况:

```python # 查看数据基本信息 print("\n数据形状(行数,列数):", df.shape) print("\n数据类型:") print(df.dtypes) print("\n数据描述统计:") print(df.describe()) # 查看前几行和后几行 print("\n前 3 行数据:") print(df.head(3)) print("\n后 2 行数据:") print(df.tail(2)) ```

数据清洗是数据分析过程中最耗时也最重要的环节。真实世界的数据往往包含缺失值、重复值或格式不一致的问题。下面我们演示常见的数据清洗操作:

```python # 创建包含缺失值的示例数据 data_with_nan = { 'order_id': [1001, 1002, 1003, 1004, 1005, 1006], 'user_id': [101, 102, 103, 104, 105, np.nan], 'product_name': ['笔记本电脑', '无线鼠标', None, '显示器', '耳机', '数据线'], 'price': [5999.00, 129.00, 399.00, np.nan, 299.00, 39.00], 'quantity': [1, 2, 1, 1, 3, 5] } df_nan = pd.DataFrame(data_with_nan) print("包含缺失值的数据:") print(df_nan) # 检测缺失值 print("\n缺失值统计:") print(df_nan.isnull().sum()) # 处理缺失值 - 填充 df_filled = df_nan.fillna({ 'user_id': 0, 'product_name': '未知商品', 'price': df_nan['price'].mean() }) # 处理缺失值 - 删除 df_dropped = df_nan.dropna() print("\n填充后的数据:") print(df_filled) ```

数据筛选和过滤是分析中的高频操作。Pandas 提供了多种灵活的方式来定位和提取满足条件的数据:

```python # 筛选价格大于 100 元的商品 high_price = df[df['price'] > 100] print("价格大于 100 元的商品:") print(high_price[['product_name', 'price']]) # 多条件筛选 complex_filter = df[ (df['price'] > 200) & (df['quantity'] >= 1) & (df['status'].isin(['已发货', '已完成'])) ] print("\n多条件筛选结果:") print(complex_filter[['product_name', 'price', 'status']]) # 使用 query 方法进行筛选 result = df.query("price > 200 and quantity >= 1") print("\n使用 query 方法筛选:") print(result) ```

数据聚合和分组分析是发现数据规律的重要手段。通过 groupby 操作,我们可以按某个特征对数据进行分组,然后计算每个组的统计指标:

```python # 按订单状态分组统计 status_stats = df.groupby('status').agg({ 'order_id': 'count', 'price': ['sum', 'mean'] }) print("按订单状态分组统计:") print(status_stats) # 计算每个订单的总金额 df['total_amount'] = df['price'] * df['quantity'] print("\n添加总金额列后的数据:") print(df[['order_id', 'product_name', 'quantity', 'total_amount']]) # 按用户分组计算消费总额 user_spend = df.groupby('user_id')['total_amount'].sum().sort_values(ascending=False) print("\n用户消费总额排序:") print(user_spend) ```

时间序列数据处理是 Pandas 的强项之一。很多业务数据都带有时间维度,正确处理时间数据能帮助我们进行趋势分析和周期性分析:

```python # 转换日期格式 df['order_date'] = pd.to_datetime(df['order_date']) # 提取时间特征 df['year'] = df['order_date'].dt.year df['month'] = df['order_date'].dt.month df['weekday'] = df['order_date'].dt.day_name() df['is_weekend'] = df['order_date'].dt.weekday >= 5 print("添加时间特征后的数据:") print(df[['order_date', 'year', 'month', 'weekday', 'is_weekend']]) # 按日期统计订单量 daily_orders = df.groupby('order_date').size() print("\n每日订单量:") print(daily_orders) ```

数据合并与连接操作让我们能够整合多个数据源。在处理复杂业务时,我们经常需要将不同的数据表关联起来:

```python # 创建用户信息表 user_info = pd.DataFrame({ 'user_id': [101, 102, 103, 104, 105], 'user_name': ['张三', '李四', '王五', '赵六', '钱七'], 'level': ['VIP', '普通', 'VIP', '普通', '普通'] }) # 创建产品信息表 product_info = pd.DataFrame({ 'product_name': ['笔记本电脑', '无线鼠标', '机械键盘', '显示器', '耳机'], 'category': ['电子', '配件', '配件', '电子', '配件'], 'stock': [50, 200, 100, 80, 150] }) # 合并订单和用户信息 order_user = pd.merge(df, user_info, on='user_id', how='left') print("订单与用户信息合并:") print(order_user[['order_id', 'user_name', 'level', 'product_name', 'total_amount']]) # 合并订单和产品信息 full_data = pd.merge(order_user, product_info, on='product_name', how='left') print("\n完整数据:") print(full_data[['order_id', 'user_name', 'product_name', 'category', 'total_amount']]) ```

数据可视化能帮助我们更直观地理解数据分布和趋势。虽然 Pandas 本身主要用于数据处理,但它与 Matplotlib 等可视化库的集成非常紧密:

```python import matplotlib.pyplot as plt # 设置中文字体支持(实际使用时需要根据系统配置) plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS'] plt.rcParams['axes.unicode_minus'] = False # 绘制商品价格分布 fig, axes = plt.subplots(2, 2, figsize=(12, 10)) # 价格柱状图 axes[0, 0].bar(df['product_name'], df['price'], color='skyblue') axes[0, 0].set_title('商品价格分布') axes[0, 0].set_xlabel('商品名称') axes[0, 0].set_ylabel('价格(元)') axes[0, 0].tick_params(axis='x', rotation=45) # 数量柱状图 axes[0, 1].bar(df['product_name'], df['quantity'], color='lightcoral') axes[0, 1].set_title('商品购买数量') axes[0, 1].set_xlabel('商品名称') axes[0, 1].set_ylabel('数量') axes[0, 1].tick_params(axis='x', rotation=45) # 总金额饼图 axes[1, 0].pie(df['total_amount'], labels=df['product_name'], autopct='%1.1f%%') axes[1, 0].set_title('订单金额占比') # 订单状态饼图 status_counts = df['status'].value_counts() axes[1, 1].pie(status_counts, labels=status_counts.index, autopct='%1.1f%%') axes[1, 1].set_title('订单状态分布') plt.tight_layout() plt.savefig('/tmp/order_analysis.png', dpi=150, bbox_inches='tight') plt.close() print("数据可视化图表已保存到 /tmp/order_analysis.png") ```

在实际项目中,我们经常需要将处理后的数据保存为文件。Pandas 支持多种数据格式的读写操作:

```python # 保存为 CSV 文件 df.to_csv('/tmp/orders.csv', index=False, encoding='utf-8') print("数据已保存到 /tmp/orders.csv") # 保存为 Excel 文件 df.to_excel('/tmp/orders.xlsx', index=False) print("数据已保存到 /tmp/orders.xlsx") # 保存为 JSON 文件 df.to_json('/tmp/orders.json', orient='records', force_ascii=False, indent=2) print("数据已保存到 /tmp/orders.json") # 读取 CSV 文件验证 df_loaded = pd.read_csv('/tmp/orders.csv') print("\n从 CSV 重新加载的数据:") print(df_loaded.head()) ```

除了基本的操作,Pandas 还提供了许多高级功能来处理复杂场景。pivot_table 是一个强大的数据透视工具,可以快速生成多维度的统计报表:

```python # 创建更丰富的示例数据 extended_data = { 'order_id': [1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008], 'user_id': [101, 102, 103, 104, 105, 101, 102, 103], 'product_name': ['笔记本电脑', '无线鼠标', '机械键盘', '显示器', '耳机', '数据线', '鼠标垫', '音箱'], 'price': [5999.00, 129.00, 399.00, 2499.00, 299.00, 39.00, 29.00, 199.00], 'quantity': [1, 2, 1, 1, 3, 5, 2, 1], 'category': ['电子', '配件', '配件', '电子', '配件', '配件', '配件', '配件'], 'order_date': pd.to_datetime([ '2026-03-15', '2026-03-16', '2026-03-16', '2026-03-17', '2026-03-17', '2026-03-18', '2026-03-18', '2026-03-19' ]), 'status': ['已发货', '已完成', '已发货', '处理中', '已完成', '已完成', '已完成', '已发货'] } df_extended = pd.DataFrame(extended_data) df_extended['total_amount'] = df_extended['price'] * df_extended['quantity'] # 使用 pivot_table 创建数据透视表 pivot_result = pd.pivot_table( df_extended, values=['total_amount', 'quantity'], index=['category'], columns=['status'], aggfunc={'total_amount': 'sum', 'quantity': 'sum'}, fill_value=0 ) print("数据透视表(按商品类别和订单状态统计):") print(pivot_result) ```

数据转换和重塑是数据分析中的重要技巧。有时我们需要改变数据的组织形式,使其更适合特定的分析或可视化需求:

```python # 创建长格式数据 long_data = pd.DataFrame({ 'date': pd.date_range('2026-03-01', periods=5), 'product': ['A', 'B', 'A', 'B', 'A'], 'sales': [100, 150, 120, 160, 110] }) # 转换为宽格式 wide_data = long_data.pivot(index='date', columns='product', values='sales') print("宽格式数据:") print(wide_data) # 使用 melt 转换回长格式 melted_data = wide_data.reset_index().melt( id_vars=['date'], value_vars=['A', 'B'], var_name='product', value_name='sales' ) print("\n长格式数据(使用 melt):") print(melted_data) ```

性能优化是处理大数据集时的关键考虑因素。Pandas 提供了多种方法来提升数据处理效率:

```python # 创建较大的数据集进行性能测试 large_data = { 'id': range(10000), 'value': np.random.randn(10000), 'category': np.random.choice(['A', 'B', 'C'], 10000), 'date': pd.date_range('2020-01-01', periods=10000) } df_large = pd.DataFrame(large_data) # 使用向量化操作(推荐) # 不要用循环,用 Pandas 内置方法 df_large['value_squared'] = df_large['value'] ** 2 df_large['value_category'] = df_large['value'] * 2 + df_large['value'].mean() # 使用 apply 进行自定义转换 def categorize_value(x): if x > 0: return 'positive' elif x < 0: return 'negative' else: return 'zero' # 对大数据集使用 apply 可能较慢,但在小数据集上很方便 df_large['sign'] = df_large['value'].apply(categorize_value) print("性能优化示例完成") print(f"处理后的数据形状:{df_large.shape}") print(f"内存使用情况:{df_large.memory_usage(deep=True).sum() / 1024:.2f} KB") ```

通过本教程的学习,你应该已经掌握了 Pandas 的核心操作技能。记住,熟练掌握 Pandas 需要大量的实践。建议你从实际项目出发,不断练习和探索 Pandas 的各种功能。Pandas 官方文档提供了详细的 API 参考,遇到问题时可以随时查阅。祝你数据分析之旅顺利!

相关文章

[Python 教程] OpenCV 实战:图像与视频文件处理

OpenCV 实战:图像与视频文件处理本文详细介绍如何使用 OpenCV 处理图像和视频文件,包括读取、显示、保存等操作。一、图像文件操作1.1 读取图像import cv2 #&nb...

[Python 教程] NumPy 数组操作详解

NumPy 数组操作详解 NumPy 是 Python 科学计算的基础库,提供高性能的多维数组对象。本文详细介绍 NumPy 数组的核心操作。 一、创建数组 import numpy as np...

[Python 教程] Python 多线程编程指南

Python 多线程编程指南 Python 的 threading 模块提供多线程支持。本文介绍多线程编程的基础和实用技巧。 一、创建线程 import threading import time...

[Python 教程] Python 网络请求与爬虫基础

Python 网络请求与爬虫基础 requests 是 Python 最常用的 HTTP 库。本文介绍网络请求和爬虫的基础知识。 一、基础请求 import requests # GET 请求 r...

Python 上下文管理器:从入门到实战

在 Python 编程中,资源管理是一个永恒的话题。无论是打开文件、连接数据库,还是获取网络资源,我们都需要确保在使用完毕后正确释放这些资源。传统的 try-finally 模式虽然有效,但代码冗长且...

Python 上下文管理器的 5 个实用技巧,让你的代码更优雅

在 Python 编程中,上下文管理器(Context Manager)是一个优雅的资源管理工具。你可能已经熟悉最常见的用法——使用 with 语句打开文件,但上下文管理器的能力远不止于此。今天,我将...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。