Pandas 简介(完整指南)

Pandas 简介:数据处理的得力助手

在数据驱动的时代,无论是做数据分析、机器学习,还是进行业务报表统计,我们总会面对大量结构化数据。如何高效地读取、清洗、分析和可视化这些数据,是每个开发者必须掌握的核心能力。而 Pandas,正是 Python 生态中处理结构化数据的“瑞士军刀”。

Pandas 是一个开源的数据分析与操作库,最初由 Wes McKinney 于 2008 年开发,如今已成为 Python 数据科学领域的基石工具之一。它提供了强大的数据结构,尤其是 DataFrame 和 Series,让复杂的数据操作变得直观且高效。对于初学者而言,Pandas 的语法简洁、功能丰富,是进入数据处理世界的理想起点。

在本文中,我们将通过实际案例带你一步步了解 Pandas 的核心功能,从基础的数据结构到常用操作,再到真实场景的应用。无论你是刚接触编程,还是已有一定经验的开发者,都能在这里找到实用的参考。

数据结构解析:Series 与 DataFrame

在学习 Pandas 之前,必须先理解它的两个核心数据结构:Series 和 DataFrame。你可以把它们想象成 Excel 表格中的“一列”和“一张表”。

Series:一维标签数组

Series 是一个一维的、带标签的数组,可以存储任意类型的数据(如整数、字符串、浮点数等),每个元素都有一个唯一的索引(index)。

import pandas as pd

data = pd.Series([100, 200, 300, 400], index=['A', 'B', 'C', 'D'])

print(data)

输出结果:

A    100
B    200
C    300
D    400
dtype: int64

中文注释:这里我们创建了一个包含 4 个数值的 Series,使用字母 A 到 D 作为自定义索引。Pandas 会自动为数据分配默认的整数索引,但你可以自定义索引,提升数据可读性。这种“标签+数据”的设计,让数据操作更加直观。

DataFrame:二维表格结构

DataFrame 是一个二维的、带标签的表格数据结构,类似于 Excel 或 SQL 表。每一列可以是不同类型的数据,但必须有相同的行数。

df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [25, 30, 35, 28],
    '城市': ['北京', '上海', '广州', '深圳']
})

print(df)

输出结果:

   姓名  年龄   城市
0  张三  25   北京
1  李四  30   上海
2  王五  35   广州
3  赵六  28   深圳

中文注释:我们通过字典的方式创建了一个包含三列的 DataFrame。每一列对应一个键值对,键是列名,值是数据列表。Pandas 会自动为每一行分配一个整数索引(0 到 3),方便后续操作。DataFrame 是 Pandas 的核心,几乎所有数据处理任务都围绕它展开。

数据读取与写入:连接真实数据源

Pandas 支持多种数据格式的读取与写入,这是它强大之处。无论是从 CSV、Excel,还是 JSON、SQL 数据库中获取数据,Pandas 都提供了简洁的接口。

读取 CSV 文件

假设你有一个销售数据文件 sales.csv,内容如下:

产品,数量,单价,日期
手机,10,5000,2024-01-01
平板,5,3000,2024-01-02
笔记本,3,8000,2024-01-03
df = pd.read_csv('sales.csv')

print(df.head(3))

中文注释pd.read_csv() 是最常用的读取函数,它能自动解析 CSV 格式,并生成 DataFrame。head(3) 用于查看前 3 行数据,常用于快速检查数据是否正确加载。

写入数据到 Excel

df.to_excel('sales_report.xlsx', index=False)

中文注释to_excel() 方法可以将 DataFrame 保存为 Excel 文件。设置 index=False 是最佳实践,避免在 Excel 表格中多出一列“0, 1, 2, 3...”的索引。

数据清洗:处理缺失值与重复数据

真实数据往往不完美,常包含缺失值(NaN)、重复记录或格式错误。Pandas 提供了丰富的工具来处理这些问题。

处理缺失值

data = pd.DataFrame({
    '姓名': ['张三', '李四', None, '赵六'],
    '年龄': [25, None, 35, 28],
    '城市': ['北京', '上海', '广州', None]
})

print("原始数据:")
print(data)

print("\n缺失值统计:")
print(data.isnull().sum())

data['姓名'].fillna('未知', inplace=True)  # 用“未知”填充姓名缺失
data['年龄'].fillna(data['年龄'].mean(), inplace=True)  # 用平均年龄填充

print("\n填充后数据:")
print(data)

中文注释isnull() 用于检测缺失值,sum() 统计每列缺失数量。fillna() 是填充函数,inplace=True 表示直接修改原数据。用均值填充数值型数据,是常见做法。

去除重复数据

df_duplicate = pd.DataFrame({
    '姓名': ['张三', '李四', '张三', '王五'],
    '年龄': [25, 30, 25, 35]
})

print("原始数据(含重复):")
print(df_duplicate)

df_clean = df_duplicate.drop_duplicates()

print("\n去重后数据:")
print(df_clean)

中文注释drop_duplicates() 可以去除完全重复的行。如果只想根据某几列去重,可传入 subset=['姓名']

数据分析与筛选:从数据中提取价值

Pandas 的强大不仅体现在数据准备,更体现在灵活的筛选和聚合操作上。

条件筛选

adults = df[df['年龄'] > 30]

print("年龄大于 30 的人:")
print(adults)

中文注释df['年龄'] > 30 返回一个布尔 Series,Pandas 用它作为掩码筛选出符合条件的行。这种“布尔索引”是数据筛选的常用方式。

分组聚合

grouped = df.groupby('城市')['年龄'].mean()

print("各城市平均年龄:")
print(grouped)

输出结果:

城市
北京    25.0
上海    30.0
广州    35.0
深圳    28.0
Name: 年龄, dtype: float64

中文注释groupby() 是分组的核心方法。这里我们按“城市”分组,并对“年龄”列求平均值。结果是一个新的 Series,城市为索引,平均年龄为值。

实际应用案例:销售数据分析

我们来做一个完整的例子:分析一份销售数据,找出销售额最高的产品。

sales_data = pd.DataFrame({
    '产品': ['手机', '手机', '平板', '平板', '笔记本', '笔记本'],
    '数量': [10, 15, 5, 8, 3, 4],
    '单价': [5000, 5000, 3000, 3000, 8000, 8000]
})

sales_data['销售额'] = sales_data['数量'] * sales_data['单价']

total_sales = sales_data.groupby('产品', as_index=False)['销售额'].sum()

top_product = total_sales.loc[total_sales['销售额'].idxmax()]

print("各产品总销售额:")
print(total_sales)

print(f"\n销售额最高的产品是:{top_product['产品']},总额为:{top_product['销售额']} 元")

中文注释idxmax() 返回最大值的索引位置,用于定位销售额最高的那一行。as_index=False 保持结果为 DataFrame,而非以产品为索引的 Series。

总结:Pandas 简介的核心价值

Pandas 作为数据处理的“标准工具”,其简洁的语法、强大的功能和广泛的应用场景,让它成为 Python 数据科学的基石。从简单的数据读取到复杂的分析建模,Pandas 都能高效支撑。

无论你是做数据分析、构建自动化报表,还是参与机器学习项目,掌握 Pandas 都是必不可少的技能。它不仅提升了开发效率,也让你更专注于业务逻辑本身。

通过本文的学习,你应该已经了解了 Pandas 的核心结构、常见操作以及真实应用场景。建议你动手实践,从本地 CSV 文件开始,一步步构建自己的数据处理流程。记住,编程能力的提升,始于每一次“写代码”的尝试。