Joyful Pandas的数据处理与分析:从入门到精通的完整指南
【免费下载链接】joyful-pandas pandas中文教程 项目地址: https://gitcode.com/datawhalechina/joyful-pandas
引言:为什么选择Pandas进行数据处理?
在数据科学和数据分析领域,数据处理是至关重要的一环。你是否曾经遇到过这样的困境:
- 面对海量的CSV、Excel数据文件,手动处理效率低下?
- 需要快速进行数据清洗、转换和分析,但不知道从何入手?
- 想要进行复杂的数据聚合和统计计算,但传统工具力不从心?
Pandas(Python Data Analysis Library)正是为了解决这些问题而生的强大工具。作为Python生态系统中最受欢迎的数据处理库,Pandas提供了高效、灵活的数据结构,让你能够轻松处理各种结构化数据。
本文将基于Datawhale的Joyful Pandas教程,带你全面掌握Pandas的核心功能和使用技巧。
一、Pandas基础:两大核心数据结构
1.1 Series:一维数据的完美容器
Series是Pandas中最基本的数据结构,可以理解为带标签的一维数组。让我们通过一个示例来理解:
import pandas as pd
import numpy as np
# 创建Series的多种方式
s1 = pd.Series([1, 3, 5, np.nan, 6, 8])
s2 = pd.Series({'a': 1, 'b': 2, 'c': 3})
s3 = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
print("基本Series示例:")
print(s1)
print("\n字典创建Series:")
print(s2)
print("\n自定义索引Series:")
print(s3)
Series的核心属性:
| 属性 | 描述 | 示例 |
|---|---|---|
| values | 数据值数组 | s.values |
| index | 索引对象 | s.index |
| dtype | 数据类型 | s.dtype |
| name | Series名称 | s.name |
| shape | 形状 | s.shape |
1.2 DataFrame:二维数据的强大处理工具
DataFrame是Pandas的核心数据结构,类似于Excel表格或SQL表,由行索引和列索引组成。
# 创建DataFrame的多种方式
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 35, 28],
'城市': ['北京', '上海', '广州', '深圳'],
'薪资': [15000, 20000, 18000, 22000]
}
df = pd.DataFrame(data)
print("基本DataFrame:")
print(df)
print("\nDataFrame信息:")
print(f"形状: {df.shape}")
print(f"列名: {df.columns.tolist()}")
print(f"索引: {df.index.tolist()}")
二、数据读写:多种格式无缝对接
2.1 文件读取实战
Pandas支持多种数据格式的读取,让我们看看如何操作:
# 读取CSV文件
df_csv = pd.read_csv('data/company.csv')
print("CSV文件前5行:")
print(df_csv.head())
# 读取Excel文件
df_excel = pd.read_excel('data/color.xlsx')
print("\nExcel文件前3行:")
print(df_excel.head(3))
# 读取TXT文件(自定义分隔符)
df_txt = pd.read_table('data/my_table_special_sep.txt',
sep=' \|\\|\\|\\| ', engine='python')
print("\nTXT文件内容:")
print(df_txt)
2.2 高级读取技巧
# 带参数的读取示例
df_advanced = pd.read_csv('data/company.csv',
usecols=['公司名称', '行业', '市值'], # 只读取指定列
nrows=100, # 只读取前100行
encoding='utf-8', # 指定编码
parse_dates=['上市日期']) # 解析日期列
print("高级读取示例:")
print(df_advanced.info())
2.3 数据写入与导出
# 数据导出示例
df.to_csv('output/processed_data.csv', index=False, encoding='utf-8-sig')
df.to_excel('output/processed_data.xlsx', index=False)
# 导出为Markdown和LaTeX格式
print("Markdown格式:")
print(df.to_markdown())
print("\nLaTeX格式:")
print(df.to_latex())
三、数据清洗与预处理:打造高质量数据集
3.1 处理缺失值
# 创建包含缺失值的数据
data_with_na = {
'A': [1, 2, np.nan, 4, 5],
'B': [np.nan, 2, 3, np.nan, 5],
'C': [1, 2, 3, 4, 5]
}
df_na = pd.DataFrame(data_with_na)
print("原始数据:")
print(df_na)
# 检测缺失值
print("\n缺失值统计:")
print(df_na.isnull().sum())
# 处理缺失值
df_filled = df_na.fillna({'A': df_na['A'].mean(), 'B': '未知'})
print("\n填充后的数据:")
print(df_filled)
3.2 数据去重与类型转换
# 数据去重
df_duplicates = pd.DataFrame({
'name': ['Alice', 'Bob', 'Alice', 'Charlie', 'Bob'],
'age': [25, 30, 25, 35, 30]
})
print("去重前:")
print(df_duplicates)
print("\n去重后:")
print(df_duplicates.drop_duplicates())
# 数据类型转换
df_types = pd.DataFrame({
'str_col': ['1', '2', '3'],
'float_col': [1.1, 2.2, 3.3],
'int_col': [1, 2, 3]
})
df_types['str_col'] = df_types['str_col'].astype(int)
print("\n类型转换后:")
print(df_types.dtypes)
四、数据筛选与排序:精准定位所需信息
4.1 条件筛选
# 创建示例数据
df_employees = pd.DataFrame({
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'部门': ['技术部', '市场部', '技术部', '人事部', '市场部'],
'薪资': [15000, 12000, 18000, 10000, 13000],
'工龄': [3, 2, 5, 1, 4]
})
# 单条件筛选
tech_dept = df_employees[df_employees['部门'] == '技术部']
print("技术部员工:")
print(tech_dept)
# 多条件筛选
high_salary_tech = df_employees[
(df_employees['部门'] == '技术部') &
(df_employees['薪资'] > 16000)
]
print("\n技术部高薪员工:")
print(high_salary_tech)
# 复杂条件筛选
senior_employees = df_employees[
(df_employees['工龄'] >= 3) |
(df_employees['薪资'] > 14000)
]
print("\n资深或高薪员工:")
print(senior_employees)
4.2 数据排序
# 单列排序
sorted_by_salary = df_employees.sort_values('薪资', ascending=False)
print("按薪资降序排序:")
print(sorted_by_salary)
# 多列排序
sorted_multi = df_employees.sort_values(['部门', '薪资'], ascending=[True, False])
print("\n按部门升序、薪资降序排序:")
print(sorted_multi)
# 自定义排序
department_order = ['技术部', '市场部', '人事部']
df_employees['部门'] = pd.Categorical(df_employees['部门'], categories=department_order)
custom_sorted = df_employees.sort_values('部门')
print("\n自定义部门顺序排序:")
print(custom_sorted)
五、数据聚合与分组:深度洞察数据规律
5.1 分组统计
# 分组聚合示例
grouped = df_employees.groupby('部门')
print("各部门统计信息:")
print(grouped.agg({
'薪资': ['mean', 'max', 'min', 'count'],
'工龄': 'mean'
}))
# 多维度分组
print("\n各部门各工龄段薪资统计:")
if '工龄段' not in df_employees.columns:
df_employees['工龄段'] = pd.cut(df_employees['工龄'],
bins=[0, 2, 4, 6],
labels=['新手', '中级', '资深'])
multi_grouped = df_employees.groupby(['部门', '工龄段'])
print(multi_grouped['薪资'].mean().unstack())
5.2 透视表与交叉表
# 透视表示例
pivot_table = pd.pivot_table(df_employees,
values='薪资',
index='部门',
columns='工龄段',
aggfunc=['mean', 'count'],
fill_value=0)
print("薪资透视表:")
print(pivot_table)
# 交叉表示例
cross_tab = pd.crosstab(df_employees['部门'],
df_employees['工龄段'],
values=df_employees['薪资'],
aggfunc='mean')
print("\n部门与工龄段交叉表:")
print(cross_tab)
六、时间序列处理:时序数据分析专家
6.1 时间序列基础
# 创建时间序列数据
dates = pd.date_range('20230101', periods=6)
ts_data = pd.DataFrame({
'日期': dates,
'销售额': np.random.randint(1000, 5000, 6),
'客户数': np.random.randint(50, 200, 6)
})
print("时间序列数据:")
print(ts_data)
# 设置时间索引
ts_data.set_index('日期', inplace=True)
print("\n设置时间索引后:")
print(ts_data.head())
# 时间序列重采样
print("\n月度重采样(求平均):")
monthly_resampled = ts_data.resample('M').mean()
print(monthly_resampled)
6.2 时间序列分析
# 移动平均计算
ts_data['7天移动平均'] = ts_data['销售额'].rolling(window=2).mean()
ts_data['累计销售额'] = ts_data['销售额'].cumsum()
print("添加移动平均和累计值:")
print(ts_data)
# 时间差计算
if len(ts_data) > 1:
ts_data['日环比'] = ts_data['销售额'].pct_change() * 100
print("\n添加日环比增长率:")
print(ts_data[['销售额', '日环比']])
七、高级技巧与性能优化
7.1 向量化操作
# 避免循环,使用向量化操作
df_employees['奖金'] = df_employees['薪资'] * 0.1 # 向量化乘法
df_employees['总包'] = df_employees['薪资'] + df_employees['奖金']
# 使用apply进行复杂操作
def calculate_bonus(row):
if row['工龄'] > 3:
return row['薪资'] * 0.15
else:
return row['薪资'] * 0.1
df_employees['智能奖金'] = df_employees.apply(calculate_bonus, axis=1)
print("智能奖金计算:")
print(df_employees[['姓名', '薪资', '工龄', '智能奖金']])
7.2 内存优化
# 查看内存使用情况
print("内存使用情况:")
print(df_employees.info(memory_usage='deep'))
# 优化数据类型
def optimize_dtypes(df):
for col in df.columns:
if df[col].dtype == 'object':
# 对于类别型数据,转换为category节省内存
if df[col].nunique() / len(df[col]) < 0.5:
df[col] = df[col].astype('category')
elif df[col].dtype == 'int64':
# 向下转换整数类型
df[col] = pd.to_numeric(df[col], downcast='integer')
elif df[col].dtype == 'float64':
# 向下转换浮点类型
df[col] = pd.to_numeric(df[col], downcast='float')
return df
df_optimized = optimize_dtypes(df_employees.copy())
print("\n优化后的内存使用:")
print(df_optimized.info(memory_usage='deep'))
八、实战案例:电商数据分析
让我们通过一个完整的案例来巩固所学知识:
# 模拟电商数据
np.random.seed(42)
n_records = 1000
ecommerce_data = pd.DataFrame({
'订单ID': range(1, n_records + 1),
'用户ID': np.random.randint(1001, 1100, n_records),
'产品类别': np.random.choice(['电子产品', '服装', '家居', '食品'], n_records),
'销售额': np.random.uniform(10, 500, n_records).round(2),
'订单日期': pd.date_range('2023-01-01', periods=n_records, freq='H'),
'支付方式': np.random.choice(['支付宝', '微信', '信用卡', '银联'], n_records),
'是否退货': np.random.choice([0, 1], n_records, p=[0.95, 0.05])
})
print("电商数据概览:")
print(ecommerce_data.head())
print(f"\n数据形状: {ecommerce_data.shape}")
# 1. 销售分析
daily_sales = ecommerce_data.resample('D', on='订单日期')['销售额'].sum()
print("\n日销售额统计:")
print(daily_sales.head())
# 2. 品类分析
category_analysis = ecommerce_data.groupby('产品类别').agg({
'销售额': ['sum', 'mean', 'count'],
'是否退货': 'mean'
}).round(2)
category_analysis.columns = ['总销售额', '平均订单价', '订单数', '退货率']
print("\n品类分析:")
print(category_analysis)
# 3. 用户行为分析
user_analysis = ecommerce_data.groupby('用户ID').agg({
'订单ID': 'count',
'销售额': 'sum',
'是否退货': 'sum'
}).rename(columns={
'订单ID': '订单数',
'销售额': '总消费额',
'是否退货': '退货次数'
})
user_analysis['平均订单价值'] = (user_analysis['总消费额'] / user_analysis['订单数']).round(2)
print("\n用户分析前10名:")
print(user_analysis.sort_values('总消费额', ascending=False).head(10))
九、总结与最佳实践
9.1 核心要点总结
通过本文的学习,你应该掌握以下Pandas核心技能:
- 数据结构:深刻理解Series和DataFrame的区别与联系
- 数据读写:熟练处理CSV、Excel、TXT等多种格式
- 数据清洗:能够处理缺失值、重复值和异常值
- 数据筛选:使用布尔索引进行复杂条件查询
- 数据聚合:运用groupby进行分组统计和分析
- 时间序列:处理时间数据并进行重采样分析
- 性能优化:使用向量化操作和内存优化技巧
9.2 最佳实践指南
| 场景 | 推荐做法 | 避免做法 |
|---|---|---|
| 数据读取 | 指定dtype、使用usecols筛选列 | 一次性读取所有列 |
| 缺失值处理 | 根据业务逻辑选择填充策略 | 简单删除或填充 |
| 循环操作 | 使用向量化操作或apply | 使用Python for循环 |
| 大数据处理 | 使用分块读取(chunksize) | 一次性读取全部数据 |
| 内存优化 | 使用category类型和向下转换 | 保持默认数据类型 |
9.3 学习路线建议
graph TD
A[Pandas基础] --> B[数据读写]
A --> C[数据清洗]
A --> D[数据筛选]
B --> E[分组聚合]
C --> E
D --> E
E --> F[时间序列]
E --> G[数据可视化]
F --> H[高级应用]
G --> H
H --> I[性能优化]
H --> J[实战项目]
【免费下载链接】joyful-pandas pandas中文教程 项目地址: https://gitcode.com/datawhalechina/joyful-pandas
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



