欢迎光临
我们一直在努力

第42课:Python|Pandas核心用法【DataFrame、数据清洗与统计分析实战】

在这里插入图片描述

文章目录

  • 📖 开篇导读
  • 🎯 学习目标
  • 📚 知识点理论精讲
    • 一、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 从入门到精通》系列课程导航

去订阅

🌟 感谢您耐心阅读到这里! 💡 如果本文对您有所启发欢迎: 👍 点赞📌 收藏 📤 分享给更多需要的伙伴。 🗣️ 期待在评论区看到您的想法, 共同进步。 🔔 关注我,持续获取更多干货内容~ 🤗 我们下篇文章见~

赞(0)
未经允许不得转载:171主机测评 » 第42课:Python|Pandas核心用法【DataFrame、数据清洗与统计分析实战】
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址