目录
前言
一、pandas是什么?
主要特点:
二、使用步骤
1. 环境准备和库引入
2. 读取数据
示例1:从网络URL读取CSV数据
示例2:从本地文件读取数据
示例3:探索数据集
3. 数据处理基础
数据清洗
数据选择和过滤
数据分组和聚合
4. 数据可视化
5. 高级数据分析示例
三、实际案例:完整的数据分析流程
总结
前言
在当今数据驱动的时代,数据分析已成为各行各业不可或缺的技能。Python作为最受欢迎的数据科学语言之一,拥有丰富的生态系统,其中pandas库是数据分析的核心工具。本文将详细介绍pandas库的基本概念和使用方法,帮助初学者快速上手数据处理。
一、pandas是什么?
pandas 是一个开源的Python数据分析库,它基于NumPy构建,提供了高效、灵活的数据结构,使得数据清洗、分析和处理变得简单直观。pandas的名称来源于"panel data"(面板数据)和"Python data analysis"(Python数据分析)的缩写。
主要特点:
1. 提供DataFrame和Series两种核心数据结构
2. 处理结构化数据的强大工具
3. 支持从多种数据源读取数据(CSV、Excel、SQL、JSON等)
4. 内置数据对齐和缺失数据处理功能
5. 灵活的分组、聚合和转换操作
6. 时间序列处理能力
二、使用步骤
1. 环境准备和库引入
首先确保已安装pandas及相关库。如果尚未安装,可以使用以下命令:
pip install pandas numpy matplotlib seaborn接下来,在Python脚本或Jupyter Notebook中引入必要的库:
# 引入数据处理和可视化库 import numpy as np # 数值计算库 import pandas as pd # 数据分析库 import matplotlib.pyplot as plt # 绘图库 import seaborn as sns # 高级统计图形库 import warnings # 警告处理设置可视化风格
plt.style.use('seaborn-v0_8-whitegrid')
sns.set_palette("husl")忽略警告信息,保持输出整洁
warnings.filterwarnings('ignore')处理SSL证书验证问题(避免从HTTPS链接读取数据时的证书错误)
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
2. 读取数据
pandas支持多种数据格式的读取,以下是常见的数据读取方法:
示例1:从网络URL读取CSV数据
# 从网络URL读取成人收入数据集 url = 'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv' data = pd.read_csv(url) # 显示数据前5行 print("数据集前5行:") print(data.head()) # 显示数据集基本信息 print("\n数据集基本信息:") print(f"数据集形状:{data.shape}") # (行数, 列数) print(f"数据集列名:{list(data.columns)}") # 如果没有列名,可以手动指定 # data = pd.read_csv(url, header=None, names=['age', 'workclass', 'fnlwgt', ...])示例2:从本地文件读取数据
# 从本地CSV文件读取(假设文件名为'adult.csv') # data = pd.read_csv('adult.csv') # 从Excel文件读取 # data = pd.read_excel('data.xlsx', sheet_name='Sheet1') # 从JSON文件读取 # data = pd.read_json('data.json')示例3:探索数据集
# 查看数据集信息 print("\n=== 数据集详细信息 ===") print(data.info()) # 查看统计摘要 print("\n=== 数值型列统计摘要 ===") print(data.describe()) # 查看非数值型列统计 print("\n=== 非数值型列统计 ===") print(data.describe(include=['object'])) # 检查缺失值 print("\n=== 缺失值统计 ===") print(data.isnull().sum()) # 如果列名缺失,显示前几行数据以了解结构 if data.columns[0] == '0': # 如果第一列名为'0',可能没有列名 print("\n检测到可能没有列名,显示原始数据:") print(data.head())3. 数据处理基础
数据清洗
```python # 添加列名(根据数据集实际情况) column_names = [ 'age', 'workclass', 'fnlwgt', 'education', 'education_num', 'marital_status', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_per_week', 'native_country', 'income' ] # 如果数据没有列名,则添加 if len(data.columns) == len(column_names): data.columns = column_names print("已添加列名") print(data.head()) else: print(f"列名数量不匹配: 数据有{len(data.columns)}列,提供的列名有{len(column_names)}个") # 处理缺失值(如果有) # 删除包含缺失值的行 # data_cleaned = data.dropna() # 用特定值填充缺失值 # data_filled = data.fillna(0) # 或用 data.fillna(method='ffill') # 检查数据唯一值 print("\n=== 分类变量唯一值 ===") categorical_cols = data.select_dtypes(include=['object']).columns for col in categorical_cols[:3]: # 显示前3个分类列 print(f"{col}: {data[col].unique()[:10]}") # 显示前10个唯一值数据选择和过滤
# 选择特定列 age_income_data = data[['age', 'education', 'occupation', 'income']] print("\n年龄、教育和收入数据前5行:") print(age_income_data.head()) # 条件过滤 high_income = data[data['income'] == ' >50K'] print(f"\n高收入人群数量:{len(high_income)}") print(f"高收入人群比例:{len(high_income)/len(data)*100:.2f}%") # 多条件过滤 young_high_income = data[(data['age'] < 30) & (data['income'] == ' >50K')] print(f"\n30岁以下高收入人群数量:{len(young_high_income)}")数据分组和聚合
# 按教育水平分组计算平均年龄 education_age = data.groupby('education')['age'].mean().sort_values(ascending=False) print("\n按教育水平分组的平均年龄:") print(education_age.head()) # 多列分组和多重聚合 income_by_education_sex = data.groupby(['education', 'sex'])['income'].apply( lambda x: (x == ' >50K').mean() * 100 ).unstack() print("\n按教育和性别分组的收入超过50K的比例(%):") print(income_by_education_sex.head())4. 数据可视化
# 创建图形 fig, axes = plt.subplots(2, 2, figsize=(14, 10)) # 1. 年龄分布直方图 axes[0, 0].hist(data['age'], bins=30, edgecolor='black', alpha=0.7) axes[0, 0].set_title('年龄分布') axes[0, 0].set_xlabel('年龄') axes[0, 0].set_ylabel('频数') # 2. 收入分布饼图 income_counts = data['income'].value_counts() axes[0, 1].pie(income_counts.values, labels=income_counts.index, autopct='%1.1f%%') axes[0, 1].set_title('收入分布') # 3. 每周工作小时数箱线图 data.boxplot(column='hours_per_week', by='income', ax=axes[1, 0]) axes[1, 0].set_title('按收入分组的每周工作小时数') axes[1, 0].set_xlabel('收入') axes[1, 0].set_ylabel('每周工作小时数') # 4. 教育水平与收入关系 education_income = data.groupby('education')['income'].apply( lambda x: (x == ' >50K').mean() * 100 ).sort_values(ascending=False) education_income.head(10).plot(kind='barh', ax=axes[1, 1]) axes[1, 1].set_title('教育水平与高收入比例') axes[1, 1].set_xlabel('高收入比例(%)') plt.tight_layout() plt.show()5. 高级数据分析示例
# 创建收入分类的数值列 data['income_numeric'] = data['income'].apply(lambda x: 1 if x == ' >50K' else 0) # 计算不同职业的高收入比例 occupation_income = data.groupby('occupation')['income_numeric'].agg(['mean', 'count']) occupation_income.columns = ['high_income_rate', 'count'] occupation_income['high_income_rate'] = occupation_income['high_income_rate'] * 100 occupation_income = occupation_income.sort_values('high_income_rate', ascending=False) print("\n=== 不同职业的高收入比例 ===") print(occupation_income.head(10)) # 可视化:职业与高收入比例 plt.figure(figsize=(12, 8)) top_occupations = occupation_income.head(15) bars = plt.barh(range(len(top_occupations)), top_occupations['high_income_rate']) plt.yticks(range(len(top_occupations)), top_occupations.index) plt.xlabel('高收入比例(%)') plt.title('高收入比例最高的15种职业') plt.gca().invert_yaxis() # 最高的显示在顶部 # 在条形上添加数值标签 for i, bar in enumerate(bars): width = bar.get_width() plt.text(width + 0.5, bar.get_y() + bar.get_height()/2, f'{width:.1f}%', va='center') plt.tight_layout() plt.show() # 相关性分析(数值型变量) numeric_cols = data.select_dtypes(include=[np.number]).columns correlation_matrix = data[numeric_cols].corr() plt.figure(figsize=(10, 8)) sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0) plt.title('数值变量相关性热图') plt.show()三、实际案例:完整的数据分析流程
# 完整的数据分析工作流程示例 def complete_data_analysis(data_path): """ 完整的数据分析流程函数 参数: data_path: 数据路径或URL """ # 1. 数据加载 print("步骤1: 数据加载") df = pd.read_csv(data_path) print(f"原始数据形状: {df.shape}") # 2. 数据探索 print("\n步骤2: 数据探索") print("数据前5行:") print(df.head()) print("\n数据类型:") print(df.dtypes) print("\n缺失值统计:") print(df.isnull().sum()) # 3. 数据清洗 print("\n步骤3: 数据清洗") # 添加列名(如果缺失) if df.columns[0] == '0': df.columns = column_names # 处理缺失值(示例:删除有缺失的行) initial_count = len(df) df_cleaned = df.dropna() print(f"删除缺失值后数据: {len(df_cleaned)}行 (删除了{initial_count - len(df_cleaned)}行)") # 4. 特征工程 print("\n步骤4: 特征工程") # 创建收入二值特征 df_cleaned['high_income'] = df_cleaned['income'].apply( lambda x: 1 if '>50K' in str(x) else 0 ) # 创建年龄分组 bins = [0, 25, 35, 45, 55, 65, 100] labels = ['<25', '25-35', '35-45', '45-55', '55-65', '65+'] df_cleaned['age_group'] = pd.cut(df_cleaned['age'], bins=bins, labels=labels) # 5. 数据分析 print("\n步骤5: 数据分析") # 高收入人群特征 high_income_stats = df_cleaned[df_cleaned['high_income'] == 1].describe() low_income_stats = df_cleaned[df_cleaned['high_income'] == 0].describe() print("高收入人群统计摘要:") print(high_income_stats.loc[['mean', 'std', 'min', 'max'], ['age', 'education_num', 'hours_per_week']]) # 6. 数据可视化 print("\n步骤6: 数据可视化") fig, axes = plt.subplots(2, 2, figsize=(14, 10)) # 年龄分布对比 axes[0, 0].hist([df_cleaned[df_cleaned['high_income']==0]['age'], df_cleaned[df_cleaned['high_income']==1]['age']], bins=20, label=['<=50K', '>50K'], alpha=0.7, edgecolor='black') axes[0, 0].legend() axes[0, 0].set_title('不同收入群体的年龄分布') axes[0, 0].set_xlabel('年龄') axes[0, 0].set_ylabel('频数') # 教育水平与收入关系 education_income = df_cleaned.groupby('education')['high_income'].mean().sort_values(ascending=False) education_income.head(10).plot(kind='bar', ax=axes[0, 1]) axes[0, 1].set_title('教育水平与高收入比例') axes[0, 1].set_ylabel('高收入比例') axes[0, 1].tick_params(axis='x', rotation=45) # 每周工作小时数分布 axes[1, 0].boxplot([df_cleaned[df_cleaned['high_income']==0]['hours_per_week'], df_cleaned[df_cleaned['high_income']==1]['hours_per_week']], labels=['<=50K', '>50K']) axes[1, 0].set_title('不同收入群体的每周工作小时数') axes[1, 0].set_ylabel('每周工作小时数') # 年龄组收入比例 age_group_income = df_cleaned.groupby('age_group')['high_income'].mean() age_group_income.plot(kind='bar', ax=axes[1, 1]) axes[1, 1].set_title('不同年龄组的高收入比例') axes[1, 1].set_ylabel('高收入比例') plt.tight_layout() plt.show() return df_cleaned # 执行完整分析 print("="*50) print("开始完整数据分析流程") print("="*50) # 注意:这里使用示例URL,实际使用时可以替换为本地文件路径 analyzed_data = complete_data_analysis('https://xxx.csv') print("\n分析完成!")总结
本文系统介绍了pandas库的基本概念、核心功能和使用方法,涵盖了从数据读取、清洗、探索到可视化的完整数据分析流程。通过实际示例,我们展示了:
1. pandas的核心价值:作为Python数据分析的瑞士军刀,pandas提供了高效、灵活的数据处理能力
2. 数据处理流程:从原始数据到洞察发现的完整工作流
3. 数据可视化:将分析结果直观呈现的方法
4.实际应用:通过真实数据集演示分析技巧pandas的强大之处在于它的简洁性和表达力,使得复杂的数据操作可以用几行代码完成。对于初学者,建议从本文示例出发,逐步探索pandas更高级的功能,如时间序列分析、数据透视表、多级索引等。
数据分析是一个迭代的过程,需要结合业务理解和统计知识。掌握pandas只是第一步,但这是迈向数据科学领域的重要基石。随着实践经验的积累,你将能更熟练地运用pandas解决各种实际数据分析问题。