第一章:Pandas 简介与环境准备

📋 章节概述

本章是 Pandas 零基础教程的开篇,旨在帮助读者建立对 Pandas 的整体认知,掌握核心数据结构 Series 和 DataFrame 的基本用法。

🎯 学习目标

  1. 理解 Pandas 是什么以及它能做什么
  2. 掌握 Pandas 的核心数据结构:Series 和 DataFrame
  3. 学会查看 Pandas 版本信息
  4. 完成第一个 Pandas 程序

📊 知识结构图

Pandas 入门

环境准备

核心数据结构

实战案例

导入库

查看版本

Series
一维带标签数组

DataFrame
二维表格结构

创建方式

基本属性

基本操作

创建方式

基本属性

基本方法

员工信息管理

部门统计

绩效分析

1.1 什么是 Pandas?

Pandas 是 Python 语言的一个开源数据分析库,名称来源于 “Panel Data”(面板数据)。

Pandas 的主要功能:

  • 数据清洗:处理缺失值、重复值、异常值
  • 数据转换:合并、重塑、透视表
  • 数据分析:分组聚合、统计分析
  • 数据可视化:与 Matplotlib 集成快速绘图
  • 数据读写:支持 CSV、Excel、SQL、JSON 等多种格式

为什么学习 Pandas?

  • 是 Python 数据分析领域的标准工具
  • 语法简洁,学习曲线平缓
  • 与 NumPy、Matplotlib、Scikit-learn 等库无缝集成
  • 社区活跃,文档完善

1.2 环境检查与导入

# 导入 pandas 库,约定俗成的别名为 pd
# 这种简写方式可以大大提高代码编写效率
import pandas as pd

# 同时导入 numpy,pandas 底层依赖 numpy,经常需要配合使用
import numpy as np

# 查看 Pandas 版本信息
# 在 2026 年,我们使用的是 pandas 3.0.2 版本
print("=" * 60)
print("Pandas 版本信息")
print("=" * 60)
print(f"Pandas 版本: {pd.__version__}")
print(f"NumPy 版本: {np.__version__}")
============================================================
Pandas 版本信息
============================================================
Pandas 版本: 3.0.2
NumPy 版本: 2.4.4

1.3 Pandas 的两大核心数据结构

Pandas 提供了两种主要的数据结构:

Pandas 数据结构

Series
一维带标签数组

DataFrame
二维表格结构

Column 1
Series

Column 2
Series

Column 3
Series

1. Series(系列/序列)

  • 一维带标签数组
  • 可以存储任意数据类型(整数、字符串、浮点数等)
  • 类似于一列 Excel 表格或 SQL 表中的一列
  • 每个元素都有一个对应的索引(label)

2. DataFrame(数据框/数据帧)

  • 二维带标签数据结构
  • 由多个 Series 组成,共享同一个索引
  • 类似于 Excel 工作表或 SQL 表
  • 是 Pandas 最常用的数据结构

1.4 Series 对象详解

示例1:从列表创建 Series

# pd.Series(data, index, dtype, name)
#   - data: 数据,可以是列表、字典、NumPy 数组等
#   - index: 索引标签,如果不指定则使用默认整数索引 0, 1, 2...
#   - dtype: 数据类型,自动推断或手动指定
#   - name: Series 的名称,便于识别

employee_names = pd.Series(
    data=["张三", "李四", "王五", "赵六"],  # 数据值
    name="员工姓名"  # Series 名称
)

print("从列表创建 Series(员工姓名):")
print(employee_names)
print(f"\n数据类型: {employee_names.dtype}")
从列表创建 Series(员工姓名):
0    张三
1    李四
2    王五
3    赵六
Name: 员工姓名, dtype: str

数据类型: str

示例2:带自定义索引的 Series

# 通过 index 参数可以为每个数据点赋予有意义的标签
monthly_sales = pd.Series(
    data=[150000, 180000, 165000, 200000],  # 月度销售额(元)
    index=["1月", "2月", "3月", "4月"],  # 自定义索引标签
    name="月度销售额"  # Series 名称
)

print("带自定义索引的 Series(月度销售额):")
print(monthly_sales)
带自定义索引的 Series(月度销售额):
1月    150000
2月    180000
3月    165000
4月    200000
Name: 月度销售额, dtype: int64

示例3:从字典创建 Series

# 字典的 key 自动成为索引,value 成为数据值
salary_dict = {"张三": 8000, "李四": 12000, "王五": 9500, "赵六": 15000}
salary_series = pd.Series(salary_dict, name="员工薪资")

print("从字典创建 Series(员工薪资):")
print(salary_series)
从字典创建 Series(员工薪资):
张三     8000
李四    12000
王五     9500
赵六    15000
Name: 员工薪资, dtype: int64

示例4:Series 的基本属性

print("Series 的基本属性:")
print(f"  values(数据值): {salary_series.values}")  # 返回 NumPy 数组
print(f"  index(索引): {salary_series.index}")  # 返回索引对象
print(f"  dtype(数据类型): {salary_series.dtype}")  # 数据类型
print(f"  shape(形状): {salary_series.shape}")  # 返回 (元素个数,)
print(f"  size(元素个数): {salary_series.size}")  # 元素总数
print(f"  name(名称): {salary_series.name}")  # Series 名称
Series 的基本属性:
  values(数据值): [ 8000 12000  9500 15000]
  index(索引): Index(['张三', '李四', '王五', '赵六'], dtype='str')
  dtype(数据类型): int64
  shape(形状): (4,)
  size(元素个数): 4
  name(名称): 员工薪资

示例5:Series 的基本操作

print("Series 的基本操作:")
print(f"  访问单个元素 salary_series['张三'] = {salary_series['张三']}")
print(f"  切片访问 salary_series[1:3]:")
print(salary_series[1:3])
print(f"  平均值: {salary_series.mean():.2f}")
print(f"  最大值: {salary_series.max()}")
print(f"  最小值: {salary_series.min()}")
Series 的基本操作:
  访问单个元素 salary_series['张三'] = 8000
  切片访问 salary_series[1:3]:
李四    12000
王五     9500
Name: 员工薪资, dtype: int64
  平均值: 11125.00
  最大值: 15000
  最小值: 8000

1.5 DataFrame 对象详解

示例6:从字典创建 DataFrame

# 方式1:从字典创建 DataFrame
# 字典的 key 成为列名,value 成为该列的数据
# 所有列共享同一个行索引

employee_data = {
    "姓名": ["张三", "李四", "王五", "赵六", "钱七"],
    "部门": ["技术部", "销售部", "技术部", "人事部", "销售部"],
    "入职日期": ["2026-01-15", "2026-02-20", "2026-03-10", "2026-01-05", "2026-02-18"],
    "薪资": [8000, 12000, 9500, 7500, 11000],
    "绩效评分": [4.5, 4.8, 4.2, 4.6, 4.7]
}

df_employees = pd.DataFrame(employee_data)

print("从字典创建 DataFrame(员工信息表):")
print(df_employees)
从字典创建 DataFrame(员工信息表):
   姓名   部门        入职日期     薪资  绩效评分
0  张三  技术部  2026-01-15   8000   4.5
1  李四  销售部  2026-02-20  12000   4.8
2  王五  技术部  2026-03-10   9500   4.2
3  赵六  人事部  2026-01-05   7500   4.6
4  钱七  销售部  2026-02-18  11000   4.7

示例7:从列表创建 DataFrame(指定列名)

# pd.DataFrame(data, index, columns, dtype)
#   - data: 二维数据
#   - columns: 列名列表
#   - index: 行索引

product_data = [
    ["P001", "笔记本电脑", "电子产品", 5999, 100],
    ["P002", "无线鼠标", "电子产品", 99, 500],
    ["P003", "办公椅", "办公家具", 899, 50],
    ["P004", "A4打印纸", "办公用品", 35, 1000],
    ["P005", "保温杯", "日用品", 128, 200]
]

df_products = pd.DataFrame(
    data=product_data,
    columns=["商品编号", "商品名称", "类别", "单价", "库存数量"]
)

print("从列表创建 DataFrame(商品库存表):")
print(df_products)
从列表创建 DataFrame(商品库存表):
   商品编号   商品名称    类别    单价  库存数量
0  P001  笔记本电脑  电子产品  5999   100
1  P002   无线鼠标  电子产品    99   500
2  P003    办公椅  办公家具   899    50
3  P004  A4打印纸  办公用品    35  1000
4  P005    保温杯   日用品   128   200

示例8:从 Series 字典创建 DataFrame

# 每个 Series 成为一列,自动对齐索引
name_series = pd.Series(["张三", "李四", "王五"], name="姓名")
age_series = pd.Series([28, 32, 25], name="年龄")
city_series = pd.Series(["北京", "上海", "广州"], name="城市")

df_from_series = pd.DataFrame({
    "姓名": name_series,
    "年龄": age_series,
    "城市": city_series
})

print("从 Series 字典创建 DataFrame:")
print(df_from_series)
从 Series 字典创建 DataFrame:
   姓名  年龄  城市
0  张三  28  北京
1  李四  32  上海
2  王五  25  广州

示例9:DataFrame 的基本属性

print("DataFrame 的基本属性:")
print(f"  shape(形状): {df_employees.shape}")  # (行数, 列数)
print(f"  行数: {df_employees.shape[0]}, 列数: {df_employees.shape[1]}")
print(f"  columns(列名): {list(df_employees.columns)}")  # 列名索引
print(f"  index(行索引): {list(df_employees.index)}")  # 行索引
print(f"  dtypes(各列数据类型):")
print(df_employees.dtypes)
DataFrame 的基本属性:
  shape(形状): (5, 5)
  行数: 5, 列数: 5
  columns(列名): ['姓名', '部门', '入职日期', '薪资', '绩效评分']
  index(行索引): [0, 1, 2, 3, 4]
  dtypes(各列数据类型):
姓名          str
部门          str
入职日期        str
薪资        int64
绩效评分    float64
dtype: object

示例10:DataFrame 的基本方法

print("head(3) - 查看前3行:")
print(df_employees.head(3))
head(3) - 查看前3行:
   姓名   部门        入职日期     薪资  绩效评分
0  张三  技术部  2026-01-15   8000   4.5
1  李四  销售部  2026-02-20  12000   4.8
2  王五  技术部  2026-03-10   9500   4.2
print("tail(2) - 查看后2行:")
print(df_employees.tail(2))
tail(2) - 查看后2行:
   姓名   部门        入职日期     薪资  绩效评分
3  赵六  人事部  2026-01-05   7500   4.6
4  钱七  销售部  2026-02-18  11000   4.7
print("info() - 数据信息概览:")
df_employees.info()
info() - 数据信息概览:
<class 'pandas.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 5 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   姓名      5 non-null      str    
 1   部门      5 non-null      str    
 2   入职日期    5 non-null      str    
 3   薪资      5 non-null      int64  
 4   绩效评分    5 non-null      float64
dtypes: float64(1), int64(1), str(3)
memory usage: 332.0 bytes
print("describe() - 数值列统计摘要:")
print(df_employees.describe())
describe() - 数值列统计摘要:
                 薪资      绩效评分
count      5.000000  5.000000
mean    9600.000000  4.560000
std     1917.028951  0.230217
min     7500.000000  4.200000
25%     8000.000000  4.500000
50%     9500.000000  4.600000
75%    11000.000000  4.700000
max    12000.000000  4.800000

1.6 实战案例:员工信息管理系统

场景描述

假设你是一家公司的 HR,需要管理员工的基本信息。你需要:

  1. 创建员工信息表
  2. 查看数据概览
  3. 计算部门人数分布
  4. 计算平均薪资
  5. 找出高绩效员工

这个案例展示了 Pandas 在实际工作中的基础应用场景。

员工数据 Pandas HR人员 员工数据 Pandas HR人员 创建DataFrame 存储员工信息 查看数据概览 返回统计信息 部门人数统计 返回分组结果 筛选高绩效员工 返回筛选结果

步骤1:创建完整的员工信息数据集

# 使用更真实的业务数据,包含更多字段
hr_data = {
    "员工编号": ["E001", "E002", "E003", "E004", "E005", "E006", "E007", "E008"],
    "姓名": ["张伟", "李娜", "王强", "刘洋", "陈静", "杨帆", "赵敏", "周杰"],
    "部门": ["技术部", "销售部", "技术部", "人事部", "财务部", "销售部", "技术部", "人事部"],
    "职位": ["工程师", "销售经理", "高级工程师", "HR专员", "会计", "销售代表", "工程师", "HR经理"],
    "入职日期": pd.to_datetime([  # 转换为日期类型
        "2026-01-15", "2026-02-20", "2026-03-10", "2026-01-05",
        "2026-02-01", "2026-03-18", "2026-01-20", "2026-02-12"
    ]),
    "薪资": [12000, 15000, 18000, 8000, 9000, 8500, 13000, 11000],
    "绩效评分": [4.5, 4.8, 4.9, 4.2, 4.0, 4.3, 4.6, 4.7],
    "是否在职": [True, True, True, True, True, True, True, True]
}

# 创建 DataFrame
df_hr = pd.DataFrame(hr_data)

print("员工信息表:")
df_hr
员工信息表:
员工编号 姓名 部门 职位 入职日期 薪资 绩效评分 是否在职
0 E001 张伟 技术部 工程师 2026-01-15 12000 4.5 True
1 E002 李娜 销售部 销售经理 2026-02-20 15000 4.8 True
2 E003 王强 技术部 高级工程师 2026-03-10 18000 4.9 True
3 E004 刘洋 人事部 HR专员 2026-01-05 8000 4.2 True
4 E005 陈静 财务部 会计 2026-02-01 9000 4.0 True
5 E006 杨帆 销售部 销售代表 2026-03-18 8500 4.3 True
6 E007 赵敏 技术部 工程师 2026-01-20 13000 4.6 True
7 E008 周杰 人事部 HR经理 2026-02-12 11000 4.7 True

步骤2:数据概览

print("数据概览:")
print(f"  总员工数: {len(df_hr)} 人")
print(f"  部门数量: {df_hr['部门'].nunique()} 个")
print(f"  平均薪资: {df_hr['薪资'].mean():.2f} 元")
print(f"  薪资范围: {df_hr['薪资'].min()} - {df_hr['薪资'].max()} 元")
数据概览:
  总员工数: 8 人
  部门数量: 4 个
  平均薪资: 11812.50 元
  薪资范围: 8000 - 18000 元

步骤3:部门人数统计

print("各部门人数分布:")
dept_count = df_hr["部门"].value_counts()
dept_count
各部门人数分布:





部门
技术部    3
销售部    2
人事部    2
财务部    1
Name: count, dtype: int64

步骤4:部门薪资分析

print("各部门薪资统计:")
dept_salary = df_hr.groupby("部门")["薪资"].agg(["mean", "min", "max", "count"])
dept_salary.columns = ["平均薪资", "最低薪资", "最高薪资", "人数"]
dept_salary.round(2)
各部门薪资统计:
平均薪资 最低薪资 最高薪资 人数
部门
人事部 9500.00 8000 11000 2
技术部 14333.33 12000 18000 3
财务部 9000.00 9000 9000 1
销售部 11750.00 8500 15000 2

步骤5:高绩效员工筛选(绩效评分 >= 4.5)

print("高绩效员工(评分 ≥ 4.5):")
high_performers = df_hr[df_hr["绩效评分"] >= 4.5][["姓名", "部门", "职位", "绩效评分"]]
print(high_performers)
print(f"\n  高绩效员工占比: {len(high_performers) / len(df_hr) * 100:.1f}%")
高绩效员工(评分 ≥ 4.5):
   姓名   部门     职位  绩效评分
0  张伟  技术部    工程师   4.5
1  李娜  销售部   销售经理   4.8
2  王强  技术部  高级工程师   4.9
6  赵敏  技术部    工程师   4.6
7  周杰  人事部   HR经理   4.7

  高绩效员工占比: 62.5%

步骤6:计算工龄

print("员工工龄统计:")
today = pd.Timestamp.now()  # 获取当前时间
df_hr["工龄_年"] = ((today - df_hr["入职日期"]).dt.days / 365.25).round(1)
df_hr[["姓名", "入职日期", "工龄_年"]].sort_values("工龄_年", ascending=False)
员工工龄统计:
姓名 入职日期 工龄_年
3 刘洋 2026-01-05 0.3
0 张伟 2026-01-15 0.2
6 赵敏 2026-01-20 0.2
4 陈静 2026-02-01 0.2
2 王强 2026-03-10 0.1
1 李娜 2026-02-20 0.1
5 杨帆 2026-03-18 0.1
7 周杰 2026-02-12 0.1

本章小结

学习内容回顾

  1. Pandas 简介

    • Pandas 是 Python 的数据分析核心库
    • 主要功能:数据清洗、转换、分析、可视化
  2. 核心数据结构

    • Series:一维带标签数组,类似表格的一列
    • DataFrame:二维表格结构,由多个 Series 组成
  3. 创建方式

    • Series:列表、字典、NumPy 数组
    • DataFrame:字典、列表、Series 字典
  4. 基本操作

    • 查看属性:shape, columns, index, dtypes
    • 查看数据:head(), tail(), info(), describe()
    • 基本统计:mean(), max(), min(), value_counts()
  5. 实战应用

    • 创建员工信息表
    • 部门统计分析
    • 绩效筛选
    • 工龄计算

下章预告

第二章:Series 对象详解

将深入学习 Series 的高级用法,包括:

  • 索引操作(位置索引 vs 标签索引)
  • 数据对齐机制
  • 缺失值处理
  • 向量化运算

课后练习

请尝试完成以下练习:

练习1:创建一个包含你所在班级(或部门)同学信息的 DataFrame,包含姓名、年龄、城市三个字段。

练习2:基于上面的员工数据 df_hr,计算:

  • 技术部的平均薪资
  • 绩效评分最高的员工姓名
  • 入职超过2年的员工列表

练习3:创建一个商品销售数据的 DataFrame,包含:商品名称、销售数量、单价、销售日期,然后计算总销售额(销售数量 × 单价)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐