Pandas数据分析 - 第一章:Pandas 简介与环境准备
·
第一章:Pandas 简介与环境准备
📋 章节概述
本章是 Pandas 零基础教程的开篇,旨在帮助读者建立对 Pandas 的整体认知,掌握核心数据结构 Series 和 DataFrame 的基本用法。
🎯 学习目标
- 理解 Pandas 是什么以及它能做什么
- 掌握 Pandas 的核心数据结构:Series 和 DataFrame
- 学会查看 Pandas 版本信息
- 完成第一个 Pandas 程序
📊 知识结构图
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 提供了两种主要的数据结构:
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,需要管理员工的基本信息。你需要:
- 创建员工信息表
- 查看数据概览
- 计算部门人数分布
- 计算平均薪资
- 找出高绩效员工
这个案例展示了 Pandas 在实际工作中的基础应用场景。
步骤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 |
本章小结
学习内容回顾
-
Pandas 简介
- Pandas 是 Python 的数据分析核心库
- 主要功能:数据清洗、转换、分析、可视化
-
核心数据结构
- Series:一维带标签数组,类似表格的一列
- DataFrame:二维表格结构,由多个 Series 组成
-
创建方式
- Series:列表、字典、NumPy 数组
- DataFrame:字典、列表、Series 字典
-
基本操作
- 查看属性:shape, columns, index, dtypes
- 查看数据:head(), tail(), info(), describe()
- 基本统计:mean(), max(), min(), value_counts()
-
实战应用
- 创建员工信息表
- 部门统计分析
- 绩效筛选
- 工龄计算
下章预告
第二章:Series 对象详解
将深入学习 Series 的高级用法,包括:
- 索引操作(位置索引 vs 标签索引)
- 数据对齐机制
- 缺失值处理
- 向量化运算
课后练习
请尝试完成以下练习:
练习1:创建一个包含你所在班级(或部门)同学信息的 DataFrame,包含姓名、年龄、城市三个字段。
练习2:基于上面的员工数据 df_hr,计算:
- 技术部的平均薪资
- 绩效评分最高的员工姓名
- 入职超过2年的员工列表
练习3:创建一个商品销售数据的 DataFrame,包含:商品名称、销售数量、单价、销售日期,然后计算总销售额(销售数量 × 单价)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)