
文章目录
- 📖 开篇导读
- 🎯 学习目标
- 📚 知识点理论精讲
-
- 一、Pandas简介与安装
-
- 1.1 什么是Pandas?
- 1.2 安装
- 二、核心数据结构:Series与DataFrame
-
- 2.1 Series(一维带标签数组)
- 2.2 DataFrame(二维表格)
- 2.3 查看数据概览
- 三、数据读写
-
- 3.1 读取CSV文件
- 3.2 读取Excel文件
- 3.3 写入CSV / Excel
- 四、数据探索与基础操作
-
- 4.1 访问列
- 4.2 访问行
- 4.3 条件筛选
- 4.4 添加/修改列
- 4.5 删除列
- 4.6 排序
- 五、数据清洗
-
- 5.1 检测缺失值
- 5.2 处理缺失值
-
- 删除缺失值
- 填充缺失值
- 插值等高级填充
- 5.3 处理重复值
- 5.4 数据类型转换
- 六、分组聚合(GroupBy)
-
- 6.1 基本分组聚合
- 6.2 对多列应用不同聚合函数
- 6.3 使用`transform`和`apply`
- 七、数据合并与连接
-
- 7.1 `concat`:沿轴拼接
- 7.2 `merge`:类似SQL的join操作
- 八、时间序列处理(简介)
- 💻 代码案例实操
-
- 案例1:创建DataFrame并探索数据
- 案例2:读写CSV和Excel文件
- 案例3:数据清洗——处理缺失值和重复值
- 案例4:数据筛选与排序
- 案例5:分组聚合(groupby)与统计
- 案例6:数据合并(concat和merge)
- 案例7:实战——电影评分数据分析
- 案例8:销售数据清洗与统计综合
- ⚠️ 易错点避坑总结
- 📝 课后实战练习题
-
-
- 第1题:创建DataFrame与基本操作
- 第2题:读取CSV并处理缺失值
- 第3题:条件筛选与分组
- 第4题:GroupBy高级聚合
- 第5题:数据合并
- 第6题:时间序列处理
- 第7题:综合清洗与分析(面试常见)
-
- 🔜 下节课预告
-
- 第43课:Matplotlib数据可视化各类图表绘制全教程
- 🔗《50节课 Python 从入门到精通》系列课程导航
📖 开篇导读
在上一节课中,我们学习了NumPy,它提供了高性能的多维数组对象和向量化运算,为科学计算打下了坚实的基础。然而,在实际的数据分析工作中,数据通常以表格形式存在:包含行索引、列名,并且可能含有缺失值、重复值,需要按条件筛选、分组聚合、合并连接等等。如果只用NumPy处理这些表格数据,代码会相当繁琐。
Pandas正是为了解决这个问题而生的。Pandas是基于NumPy构建的Python数据分析库,提供了两个核心数据结构:Series(一维标签数组)和DataFrame(二维表格,类似于Excel或SQL表)。它让数据清洗、转换、分析和可视化变得异常简单高效。
💡 工作场景:
- 数据清洗:处理缺失值、重复值、异常值,转换数据类型。
- 数据分析:计算统计量(均值、中位数、分组聚合)、时间序列分析。
- 数据读取/导出:读取CSV、Excel、JSON、SQL等格式,清洗后保存。
- 数据探索:快速查看统计信息、分布情况。
本课将系统学习Pandas的核心用法:
- Series和DataFrame的创建与基本操作
- 数据的读取与写入(CSV、Excel)
- 数据初步探索(info、describe、head)
- 数据清洗:缺失值处理、重复值处理、类型转换
- 数据筛选与排序
- 分组聚合(groupby + agg)
- 多个DataFrame的合并与连接(concat、merge)
- 实战案例:电影评分数据分析、销售数据清洗
学完本课,你将能够熟练使用Pandas完成基本的数据处理任务,为后续的数据分析和机器学习打下坚实的基础。
🎯 学习目标
| 1️⃣ | 理解Series和DataFrame的结构与创建 | 数据分析基础 |
| 2️⃣ | 掌握从CSV、Excel文件读取数据,以及写入文件 | 数据导入导出 |
| 3️⃣ | 熟练使用head()、info()、describe()等方法进行数据探索 | 快速了解数据质量 |
| 4️⃣ | 掌握数据清洗:缺失值处理(isna、dropna、fillna)、重复值处理(duplicated、drop_duplicates)、类型转换(astype) | 数据预处理核心竞争力 |
| 5️⃣ | 掌握条件筛选、列操作、排序等数据操作 | 灵活提取子集 |
| 6️⃣ | 掌握分组聚合(groupby + 聚合函数/agg)和基本的合并操作(merge、concat) | 数据汇总与整合 |
🔥 面试考点:“Pandas中的Series和DataFrame有什么区别?”“如何处理缺失值?有哪些方法?”“groupby之后如何使用agg?”“merge和concat的区别?”
📚 知识点理论精讲
一、Pandas简介与安装
1.1 什么是Pandas?
Pandas是Python Data Analysis Library的简称,提供了快速、灵活、表达力强的数据结构,旨在使数据清洗和分析工作变得简单。
1.2 安装
pip install pandas
通常还配合openpyxl(读写Excel)和xlrd/xlwt。
导⼊约定:
import pandas as pd
import numpy as np
二、核心数据结构:Series与DataFrame
2.1 Series(一维带标签数组)
Series类似于带索引的一维数组,可以看作一个字典(索引:值)。
import pandas as pd
# 从列表创建
s = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
print(s)
# 从字典创建
s2 = pd.Series({'a': 1, 'b': 2, 'c': 3})
属性:s.values(值)、s.index(索引)、s.dtype。
2.2 DataFrame(二维表格)
DataFrame是Pandas的核心,类似于Excel工作表或SQL表。它由多个Series组成(每列是一个Series),共享相同的行索引。
# 从字典创建(每个键是一列)
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Paris', 'London']
}
df = pd.DataFrame(data)
print(df)
# 指定索引
df = pd.DataFrame(data, index=['a', 'b', 'c'])
属性:df.shape、df.columns、df.index、df.dtypes、df.values(返回NumPy数组)。
2.3 查看数据概览
df.head(3) # 前3行
df.tail(2) # 后2行
df.info() # 列类型、非空值数等
df.describe() # 数值列统计信息(均值、标准差等)
df.sample(5) # 随机5行
三、数据读写
3.1 读取CSV文件
df = pd.read_csv('data.csv')
# 常用参数:sep(分隔符)、encoding、header、names、dtype、parse_dates
df = pd.read_csv('data.csv', sep=';', encoding='utf-8', index_col=0)
3.2 读取Excel文件
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
3.3 写入CSV / Excel
df.to_csv('output.csv', index=False, encoding='utf-8')
df.to_excel('output.xlsx', sheet_name='Sheet1', index=False)
四、数据探索与基础操作
4.1 访问列
df['Name'] # 返回Series
df.Name # 属性访问(列名不含空格等特殊情况)
4.2 访问行
# 位置索引 iloc
df.iloc[0] # 第一行
df.iloc[0:2, 1:3] # 前2行,第2-3列
# 标签索引 loc
df.loc[0] # 假设索引为整数标签
df.loc[0:2, 'Name':'Age']
4.3 条件筛选
# 单条件
df[df['Age'] > 30]
# 多条件(& 和 | 必须用括号)
df[(df['Age'] > 25) & (df['City'] == 'London')]
# 使用isin
df[df['City'].isin(['New York', 'Paris'])]
# 字符串方法
df[df['Name'].str.startswith('A')]
4.4 添加/修改列
df['NewCol'] = df['Age'] * 2
df['Old'] = 2025 – df['Age'] # 计算出生年份
4.5 删除列
df.drop('NewCol', axis=1, inplace=True)
4.6 排序
df.sort_values('Age', ascending=False) # 按年龄降序
df.sort_values(['City', 'Age']) # 多列排序
五、数据清洗
5.1 检测缺失值
df.isna() # 每个元素是否为NaN
df.isna().sum() # 每列缺失值个数
df.isna().any() # 每列是否有缺失
5.2 处理缺失值
删除缺失值
df.dropna() # 删除有缺失的行
df.dropna(subset=['Age']) # 只根据Age列缺失删除
df.dropna(axis=1) # 删除有缺失的列
填充缺失值
df.fillna(0) # 填充0
df['Age'].fillna(df['Age'].mean()) # 填充均值
df.fillna(method='ffill') # 前向填充
df.ffill() # 同前向填充
插值等高级填充
df.interpolate() # 线性插值(时间序列常用)
5.3 处理重复值
df.duplicated() # 标记重复行
df.drop_duplicates() # 删除重复行
df.drop_duplicates(subset=['Name']) # 基于某些列去重
df.drop_duplicates(keep='last') # 保留最后一行
5.4 数据类型转换
df['Age'] = df['Age'].astype('int64')
df['Birth'] = pd.to_datetime(df['Birth'])
# 自定义转换函数
df['Score'] = df['Score'].apply(lambda x: x * 10)
六、分组聚合(GroupBy)
6.1 基本分组聚合
# 按城市分组,计算平均年龄
grouped = df.groupby('City')['Age'].mean()
# 多列分组
grouped = df.groupby(['City', 'Gender']).agg({'Age': 'mean', 'Score': 'max'})
# 使用多个聚合函数
result = df.groupby('City')['Age'].agg(['mean', 'std', 'count'])
6.2 对多列应用不同聚合函数
df.groupby('City').agg(
avg_age=('Age', 'mean'),
max_score=('Score', 'max')
)
6.3 使用transform和apply
# 按组标准化
df['age_std'] = df.groupby('City')['Age'].transform(lambda x: (x – x.mean()) / x.std())
七、数据合并与连接
7.1 concat:沿轴拼接
# 垂直拼接(增加行)
df_concat = pd.concat([df1, df2], axis=0, ignore_index=True)
# 水平拼接(增加列)
df_concat = pd.concat([df1, df2], axis=1)
7.2 merge:类似SQL的join操作
# 内连接
merged = pd.merge(df1, df2, on='key', how='inner')
# 左连接、右连接、外连接
left_merge = pd.merge(df1, df2, on='key', how='left')
# 多键连接
pd.merge(df1, df2, on=['key1', 'key2'])
八、时间序列处理(简介)
Pandas对时间序列有强大支持:
# 将字符串列转为时间类型
df['Date'] = pd.to_datetime(df['Date'])
# 设置时间索引
df.set_index('Date', inplace=True)
# 重采样
monthly = df.resample('M').mean()
💻 代码案例实操
案例1:创建DataFrame并探索数据
"""
dataframe_basics.py
创建DataFrame并查看基本统计信息
"""
import pandas as pd
import numpy as np
# 创建DataFrame
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
'Age': [25, 30, 35, 40, 28],
'Salary': [50000, 60000, 70000, 80000, 55000],
'City': ['NYC', 'Paris', 'London', 'NYC', 'Paris']
}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)
# 查看前几行
print("\\n前2行:")
print(df.head(2))
# 统计信息
print("\\n统计信息:")
print(df.describe())
# 数据信息
print("\\n数据类型和非空统计:")
print(df.info())
# 查看列名
print("\\n列名:", df.columns.tolist())
案例2:读写CSV和Excel文件
"""
read_write_demo.py
演示从CSV/Excel读取数据,并保存清洗后的结果
"""
import pandas as pd
# 创建一个示例DataFrame并保存为CSV
df = pd.DataFrame({
'Name': ['Tom', 'Jerry', 'Spike'],
'Age': [22, 23, 24],
'Score': [85, 90, 88]
})
df.to_csv('students.csv', index=False, encoding='utf-8')
print("CSV文件已保存")
# 读取CSV
df_read = pd.read_csv('students.csv')
print("从CSV读取:")
print(df_read)
# 保存为Excel
df_read.to_excel('students.xlsx', index=False)
print("Excel文件已保存")
# 如果你已有Excel文件,可以用pd.read_excel读取
# df_excel = pd.read_excel('students.xlsx')
案例3:数据清洗——处理缺失值和重复值
"""
data_cleaning.py
演示缺失值检测、删除/填充,以及重复值处理
"""
import pandas as pd
import numpy as np
# 构造带缺失值和重复值的数据
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'Alice', 'David', None],
'Age': [25, np.nan, 35, 25, 40, 30],
'Score': [85, 90, None, 85, 88, 92]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
# 1. 检测缺失值
print("\\n缺失值统计:")
print(df.isna().sum())
# 2. 删除包含缺失值的行
df_clean = df.dropna()
print("\\n删除缺失值后:")
print(df_clean)
# 3. 填充缺失值(不删除)
df_filled = df.fillna({'Age': df['Age'].median(), 'Score': 0, 'Name': 'Unknown'})
print("\\n填充缺失值后:")
print(df_filled)
# 4. 重复值处理
print("\\n重复行标记:")
print(df.duplicated())
df_dedup = df.drop_duplicates()
print("\\n去重后:")
print(df_dedup)
# 5. 类型转换
df_filled['Age'] = df_filled['Age'].astype(int)
print("\\n转换Age为int后的dtype:", df_filled['Age'].dtype)
案例4:数据筛选与排序
"""
filter_sort.py
演示条件筛选、列选择和排序
"""
import pandas as pd
df = pd.DataFrame({
'Product': ['A', 'B', 'C', 'D', 'E'],
'Sales': [100, 250, 180, 300, 120],
'Region': ['North', 'South', 'North', 'South', 'East']
})
# 条件筛选:销售额大于150
high_sales = df[df['Sales'] > 150]
print("高销售额产品:")
print(high_sales)
# 多条件:North地区且销售额>150
north_high = df[(df['Region'] == 'North') & (df['Sales'] > 150)]
print("\\nNorth地区高销售额:")
print(north_high)
# 选择特定列
print("\\n仅Product和Sales列:")
print(df[['Product', 'Sales']])
# 排序
sorted_df = df.sort_values('Sales', ascending=False)
print("\\n按销售额降序:")
print(sorted_df)
# 使用loc和iloc
print("\\nloc选择前3行Product和Sales:")
print(df.loc[0:2, ['Product', 'Sales']])
案例5:分组聚合(groupby)与统计
"""
groupby_demo.py
演示分组聚合,计算每组统计量
"""
import pandas as pd
# 销售数据
data = {
'Product': ['A', 'B', 'A', 'B', 'C', 'A'],
'Region': ['North', 'South', 'South', 'North', 'North', 'East'],
'Sales': [100, 200, 150, 250, 300, 120],
'Profit': [30, 50, 40, 60, 80, 35]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
# 按Product分组,求Sales总和
grouped = df.groupby('Product')['Sales'].sum()
print("\\n每个产品总销售额:")
print(grouped)
# 按Region分组,求多个指标的统计
region_stats = df.groupby('Region').agg(
total_sales=('Sales', 'sum'),
avg_profit=('Profit', 'mean'),
count=('Product', 'count')
)
print("\\n各区域统计:")
print(region_stats)
# 按两个字段分组
double_group = df.groupby(['Product', 'Region'])['Sales'].sum()
print("\\n产品和区域组合销售额:")
print(double_group)
案例6:数据合并(concat和merge)
"""
merge_concat_demo.py
演示DataFrame的拼接和类似SQL的连接操作
"""
import pandas as pd
# 准备两个DataFrame
df1 = pd.DataFrame({
'ID': [1, 2, 3],
'Name': ['Alice', 'Bob', 'Charlie']
})
df2 = pd.DataFrame({
'ID': [1, 2, 4],
'Score': [85, 90, 95]
})
# concat: 垂直拼接
concat_vertical = pd.concat([df1, df2], ignore_index=True)
print("垂直拼接(列相同):")
print(concat_vertical)
# merge: 内连接
inner_merge = pd.merge(df1, df2, on='ID', how='inner')
print("\\n内连接:")
print(inner_merge)
# 左连接
left_merge = pd.merge(df1, df2, on='ID', how='left')
print("\\n左连接:")
print(left_merge)
# 外连接
outer_merge = pd.merge(df1, df2, on='ID', how='outer')
print("\\n外连接:")
print(outer_merge)
案例7:实战——电影评分数据分析
"""
movie_analysis.py
分析电影评分数据,计算不同类型电影的平均评分
"""
import pandas as pd
# 模拟电影数据
movies = pd.DataFrame({
'Movie': ['A', 'B', 'C', 'D', 'E', 'F'],
'Genre': ['Action', 'Comedy', 'Action', 'Drama', 'Comedy', 'Drama'],
'Rating': [4.5, 3.8, 4.2, 4.0, 3.5, 4.7],
'Votes': [1000, 800, 1200, 900, 1100, 1500]
})
print("电影数据:")
print(movies)
# 按类型统计平均评分和投票数
genre_stats = movies.groupby('Genre').agg(
avg_rating=('Rating', 'mean'),
total_votes=('Votes', 'sum'),
count=('Movie', 'count')
).round(2)
print("\\n按类型统计:")
print(genre_stats)
# 评分数最高的电影
top_movie = movies.loc[movies['Rating'].idxmax()]
print("\\n评分最高电影:")
print(top_movie)
# 按评分排序
sorted_by_rating = movies.sort_values('Rating', ascending=False)
print("\\n按评分排序:")
print(sorted_by_rating[['Movie', 'Rating']])
案例8:销售数据清洗与统计综合
"""
sales_cleaning_analysis.py
完整的销售数据清洗和统计流程
"""
import pandas as pd
import numpy as np
# 模拟脏数据
sales = pd.DataFrame({
'OrderID': [1, 2, 3, 4, 5, 6],
'Product': ['Laptop', 'Mouse', 'Laptop', 'Keyboard', 'Mouse', np.nan],
'Quantity': [2, 5, 1, 3, –1, 4], # 负数异常
'Price': [1000, 20, 1000, 50, 20, 30],
'Date': ['2025-01-01', '2025-01-02', '2025-01-01', 'invalid', '2025-01-03', '2025-01-02']
})
print("原始数据:")
print(sales)
# 1. 删除缺失产品名的行
sales = sales.dropna(subset=['Product'])
# 2. 清洗数量:只能为正整数
sales = sales[sales['Quantity'] > 0]
# 3. 转换日期格式,无法转换的设置为NaT并删除
sales['Date'] = pd.to_datetime(sales['Date'], errors='coerce')
sales = sales.dropna(subset=['Date'])
# 4. 添加总金额列
sales['Total'] = sales['Quantity'] * sales['Price']
# 5. 按产品分组统计总销量和总销售额
product_stats = sales.groupby('Product').agg(
total_quantity=('Quantity', 'sum'),
total_sales=('Total', 'sum'),
avg_price=('Price', 'mean')
).round(2)
print("\\n清洗后数据:")
print(sales)
print("\\n按产品统计:")
print(product_stats)
⚠️ 易错点避坑总结
| 1 | 直接修改切片视图 | SettingWithCopyWarning,修改不生效 | 使用.loc或.copy()明确 |
| 2 | 忘记inplace=True或重新赋值 | 操作未保存 | 大多数方法返回新DataFrame,需赋值或使用inplace |
| 3 | 筛选时忘记括号导致运算符优先级错误 | 条件组合错误 | 每个条件单独括号,如(df['A']>1) & (df['B']<2) |
| 4 | 读取文件后未检查编码 | 中文乱码或UnicodeDecodeError | 指定encoding='utf-8'或gbk |
| 5 | 对含缺失值的列进行聚合计算 | 默认跳过NaN,但有时不符合预期 | 使用skipna=False或先处理NaN |
| 6 | groupby后直接mean(),但未选择列 | 对所有数值列计算,结果可能多余 | df.groupby('key')['col'].mean() |
| 7 | merge时未指定how和on | 可能使用错误连接类型 | 显式写出参数 |
| 8 | 将字符串列误作数值 | 计算失败 | 用pd.to_numeric或astype转换 |
| 9 | 对日期列使用字符串操作 | 效率低且容易出错 | 转换为datetime类型后使用dt访问器 |
| 10 | 大数据量时使用循环遍历行 | 极慢 | 使用向量化操作或apply |
📝 课后实战练习题
第1题:创建DataFrame与基本操作
使用字典创建DataFrame,包含学生姓名、数学成绩、语文成绩,计算总分和平均分,并按总分排序展示前3名。
第2题:读取CSV并处理缺失值
下载或模拟一个包含缺失值的CSV文件(如气温数据),读取后用均值填充缺失值,并删除重复行。
第3题:条件筛选与分组
有一个电商订单数据(OrderID, UserID, Product, Amount)。要求:
- 筛选出金额大于100的订单
- 按用户ID分组,计算每个用户的总消费金额
- 找出消费最高的前5个用户。
第4题:GroupBy高级聚合
使用agg对以下数据按部门分组,分别计算人数、平均工资、最高工资、最低工资:
data = {'Department': ['HR', 'Tech', 'Tech', 'Sales', 'HR'],
'Name': ['A','B','C','D','E'],
'Salary': [5000, 8000, 9000, 6000, 5500]}
第5题:数据合并
有两个DataFrame:students (student_id, name) 和 scores (student_id, subject, score)。使用merge将两个表连接,并找到每个学生的平均分。
第6题:时间序列处理
有一个股票数据CSV,列包括Date(字符串)、Close。将其Date转换为时间类型并设为索引,按月重采样计算每月收盘价均值。
第7题:综合清洗与分析(面试常见)
给定一个销售数据CSV,包含OrderDate、Product、Quantity、Price。要求:
- 删除Quantity和Price为负的行
- 创建新列Revenue = Quantity * Price
- 按Product分组计算总Revenue
- 找出Revenue最高的三个产品
🔜 下节课预告
数据处理离不开可视化。下一节课我们将学习Matplotlib,它是Python最基础的绘图库,可以绘制各种统计图表。
第43课:Matplotlib数据可视化各类图表绘制全教程
内容包括:
- 绘图基本流程:figure、axes、pyplot
- 折线图、散点图、柱状图、直方图、饼图等
- 图表定制:标题、标签、图例、刻度、颜色、样式
- 多子图绘制
- 实战:销售趋势、分布图、对比图
数据可视化是数据分析的“最后一步”,让数据说话。
🌟 学习鼓励:Pandas是数据分析的瑞士军刀,学完该课后,你已经能够处理真实世界中80%的数据清洗和分析任务。请务必多动手,从GitHub或Kaggle上找一些真实数据集练习。通过本课的学习,你已经成为了一名合格的数据处理工程师,下一站是数据可视化!
🔗《50节课 Python 从入门到精通》系列课程导航
去订阅
🌟 感谢您耐心阅读到这里! 💡 如果本文对您有所启发欢迎: 👍 点赞📌 收藏 📤 分享给更多需要的伙伴。 🗣️ 期待在评论区看到您的想法, 共同进步。 🔔 关注我,持续获取更多干货内容~ 🤗 我们下篇文章见~

![[特殊字符]DeepSeek‑Harness(DSH)小白保姆教程-171主机测评](https://www.171host.com/wp-content/uploads/2026/08/20260816085112-6a817a009aabf-220x150.png)