🎯 为什么学习Pandas?
在数据科学的世界里,80%的时间都花在数据清洗和预处理上。Pandas作为Python数据分析的核心库,就像数据分析师的“瑞士军刀”,能帮你高效处理结构化数据,让数据从原始状态变成有价值的洞察。
想象一下:几行代码就能完成Excel中数小时的手工操作,这不仅是效率的提升,更是思维的解放!
📦 快速安装与导入
# 安装pandas pip install pandas # 通常与numpy一起使用 pip install pandas numpy python import pandas as pd import numpy as np print(f"Pandas版本: {pd.__version__}")🏗️ 两大核心数据结构
1. Series:一维数据容器
Series就像带标签的数组,是构建DataFrame的基础。
# 创建Series的多种方式 temperature = pd.Series([22.5, 24.0, 21.8, 23.5, 25.2], index=['周一', '周二', '周三', '周四', '周五'], name='温度') print(f"温度序列:\n{temperature}") print(f"数据类型: {temperature.dtype}") print(f"最大值: {temperature.max()}℃")2. DataFrame:二维数据表格
DataFrame是pandas的灵魂,你可以把它想象成Excel表格或SQL表。
# 创建员工信息表 employees = pd.DataFrame({ '员工ID': ['E001', 'E002', 'E003', 'E004'], '姓名': ['张明', '李华', '王芳', '赵强'], '部门': ['技术部', '市场部', '技术部', '人事部'], '入职年份': [2019, 2020, 2021, 2018], '月薪(元)': [15000, 12000, 13000, 11000], '绩效评级': ['A', 'B', 'A', 'C'] }) print("员工信息表:") print(employees)📁 数据读写:连接现实世界
读取数据(支持30+格式!)
# 读取各种格式的数据 csv_data = pd.read_csv('data/sales.csv', encoding='utf-8') # CSV文件 excel_data = pd.read_excel('data/report.xlsx', sheet_name='Sheet1') # Excel json_data = pd.read_json('data/config.json') # JSON sql_data = pd.read_sql('SELECT * FROM users', connection) # SQL数据库 # 读取网络数据 url_data = pd.read_csv('https://raw.githubusercontent.com/dataset/data.csv')保存处理结果
# 保存为不同格式 employees.to_csv('output/employees_processed.csv', index=False, encoding='utf-8') employees.to_excel('output/report.xlsx', sheet_name='员工信息') employees.to_json('output/data.json', orient='records', force_ascii=False)🔍 数据探索:第一眼看数据
# 快速了解数据全貌 print("=== 数据概览 ===") print(f"数据形状: {employees.shape}") # (行数, 列数) print(f"\n前3行数据:") print(employees.head(3)) print(f"\n数据信息:") employees.info() print(f"\n统计摘要:") print(employees.describe()) print(f"\n数值列统计:") print(employees.describe(include=[np.number])) print(f"\n非数值列统计:") print(employees.describe(include=[object])) print(f"\n缺失值统计:") print(employees.isnull().sum())🎯 数据选择:精准定位目标
选择列数据
# 选择单列(返回Series) names = employees['姓名'] # 选择多列(返回DataFrame) personal_info = employees[['姓名', '部门', '入职年份']] # 使用点号选择(列名不含空格时可用) departments = employees.部门选择行数据
# 按位置选择(iloc) first_row = employees.iloc[0] # 第一行 first_three = employees.iloc[:3] # 前三行 specific_rows = employees.iloc[[0, 2, 3]] # 第1,3,4行 # 按标签选择(loc) row_by_index = employees.loc[0] # 索引为0的行 # 条件筛选(最常用!) tech_dept = employees[employees['部门'] == '技术部'] high_salary = employees[employees['月薪(元)'] > 12000] tech_and_high = employees[(employees['部门'] == '技术部') & (employees['月薪(元)'] > 12000)] # 优雅的条件查询 result = employees.query('部门 == "技术部" and `月薪(元)` > 12000')🛠️ 数据处理:从杂乱到整洁
处理缺失值
# 创建含缺失值的数据示例 data_with_na = pd.DataFrame({ 'A': [1, 2, np.nan, 4], 'B': [5, np.nan, np.nan, 8], 'C': [9, 10, 11, 12] }) print("原始数据:") print(data_with_na) print("\n删除缺失值:") print(data_with_na.dropna()) # 删除含NA的行 print("\n填充缺失值:") print(data_with_na.fillna(0)) # 用0填充 print(data_with_na.fillna({'A': data_with_na['A'].mean(), # 列A用均值填充 'B': data_with_na['B'].median()})) # 列B用中位数填充数据转换
# 添加新列 employees['年薪(元)'] = employees['月薪(元)'] * 12 employees['工龄'] = 2024 - employees['入职年份'] employees['是否技术部'] = np.where(employees['部门'] == '技术部', '是', '否') # 修改现有列 employees['姓名'] = employees['姓名'].str.upper() # 转为大写 employees['月薪(万元)'] = employees['月薪(元)'] / 10000 # 单位转换 print("转换后的数据:") print(employees)排序与去重
# 单列排序 sorted_by_salary = employees.sort_values('月薪(元)', ascending=False) # 多列排序 sorted_multi = employees.sort_values(['部门', '月薪(元)'], ascending=[True, False]) # 去除重复行 unique_depts = employees['部门'].drop_duplicates()📊 数据分析:挖掘数据价值
分组聚合(GroupBy的强大功能)
print("=== 部门统计分析 ===") # 基础分组 dept_stats = employees.groupby('部门').agg({ '月薪(元)': ['mean', 'max', 'min', 'sum', 'count'], '入职年份': 'mean', '员工ID': 'count' }) dept_stats.columns = ['平均月薪', '最高月薪', '最低月薪', '月薪总额', '人数', '平均入职年份', '员工总数'] print(dept_stats) # 更复杂的分组操作 complex_stats = employees.groupby(['部门', '绩效评级']).agg({ '月薪(元)': ['mean', 'std'], '员工ID': 'count' }).round(2) print("\n部门-绩效交叉统计:") print(complex_stats)数据透视表(Pivot Table)
# 创建数据透视表(类似Excel数据透视表) pivot_table = pd.pivot_table(employees, values='月薪(元)', index='部门', columns='绩效评级', aggfunc=['mean', 'count'], fill_value=0) print("数据透视表:") print(pivot_table)数据合并
# 创建额外数据 bonus_data = pd.DataFrame({ '员工ID': ['E001', 'E002', 'E003'], '年终奖': [30000, 20000, 25000] }) # 合并数据 merged_data = pd.merge(employees, bonus_data, on='员工ID', how='left') merged_data['年总收入'] = merged_data['年薪(元)'] + merged_data['年终奖'].fillna(0) print("\n合并后的完整数据:") print(merged_data)🎨 数据可视化:让数据说话
import matplotlib.pyplot as plt # 设置中文字体(如果需要) plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 创建图表 fig, axes = plt.subplots(2, 2, figsize=(12, 10)) # 1. 部门人数柱状图 dept_counts = employees['部门'].value_counts() dept_counts.plot(kind='bar', ax=axes[0, 0], color='skyblue') axes[0, 0].set_title('各部门人数分布') axes[0, 0].set_ylabel('人数') # 2. 薪资分布直方图 employees['月薪(元)'].plot(kind='hist', bins=10, ax=axes[0, 1], alpha=0.7, color='lightgreen') axes[0, 1].set_title('薪资分布直方图') axes[0, 1].set_xlabel('月薪(元)') # 3. 箱线图查看薪资分布 employees.boxplot(column='月薪(元)', by='部门', ax=axes[1, 0]) axes[1, 0].set_title('各部门薪资分布(箱线图)') axes[1, 0].set_ylabel('月薪(元)') # 4. 散点图:工龄vs薪资 axes[1, 1].scatter(employees['入职年份'], employees['月薪(元)'], c='red', alpha=0.6) axes[1, 1].set_title('入职年份与薪资关系') axes[1, 1].set_xlabel('入职年份') axes[1, 1].set_ylabel('月薪(元)') plt.tight_layout() plt.savefig('output/analysis_charts.png', dpi=300, bbox_inches='tight') plt.show()💼 实战案例:销售数据分析
# 创建模拟销售数据 np.random.seed(42) # 设置随机种子保证可重复性 dates = pd.date_range('2024-01-01', '2024-03-31', freq='D') sales_data = pd.DataFrame({ '日期': dates, '产品类别': np.random.choice(['电子产品', '服装', '食品', '书籍'], len(dates)), '销售额': np.random.randint(100, 5000, len(dates)), '销售量': np.random.randint(1, 100, len(dates)), '地区': np.random.choice(['华北', '华东', '华南', '西部'], len(dates)) }) print("=== 销售数据分析报告 ===")# 1. 总体统计
print(f"分析周期: {sales_data['日期'].min().date()} 至 {sales_data['日期'].max().date()}") print(f"总销售额: ¥{sales_data['销售额'].sum():,.2f}") print(f"日均销售额: ¥{sales_data['销售额'].mean():,.2f}")# 2. 按产品类别分析
product_analysis = sales_data.groupby('产品类别').agg({ '销售额': ['sum', 'mean', 'count'], '销售量': 'sum' }).round(2) product_analysis.columns = ['总销售额', '平均销售额', '销售天数', '总销售量'] product_analysis['销售占比'] = (product_analysis['总销售额'] / product_analysis['总销售额'].sum() * 100).round(1) print("\n产品类别分析:") print(product_analysis)# 3. 时间序列分析
sales_data['月份'] = sales_data['日期'].dt.to_period('M') monthly_sales = sales_data.groupby('月份')['销售额'].sum() print("\n月度销售趋势:") for month, sales in monthly_sales.items(): print(f"{month.strftime('%Y年%m月')}: ¥{sales:,.2f}") # 4. 地区表现 region_analysis = sales_data.groupby('地区').agg({ '销售额': ['sum', 'mean'], '销售量': 'sum' }) print("\n地区销售表现:") print(region_analysis)📚 学习资源推荐
官方资源
📖 官方文档 - 最权威的参考资料
🎥 10分钟学会pandas - 快速入门指南
实践平台
📊 Kaggle Learn - 交互式学习平台
💻 DataCamp - 结构化课程
进阶学习
📘《Python for Data Analysis》 - pandas作者亲自撰写
🚀 Real Python教程 - 实践导向教程
🎓 最佳实践建议
先探索,后处理:使用
.info()和.describe()了解数据全貌处理缺失值:根据业务逻辑选择填充或删除
善用向量化操作:避免使用循环,用pandas内置函数
保持数据一致性:确保数据类型正确,处理异常值
文档化处理步骤:记录每个数据处理步骤的目的和结果
✨ 总结
Pandas不仅是一个工具,更是一种数据处理思维方式。通过本文的学习,你已经掌握了:
✅ 数据读取与保存的多种方式
✅ 数据探索与清洗的核心技巧
✅ 数据筛选与转换的灵活方法
✅ 分组聚合与统计分析的能力
✅ 数据可视化的基础技能
实践是最好的老师。找一个真实的数据集,从数据清洗到分析可视化完整走一遍流程,你会对pandas有更深刻的理解。