数据分析入门:使用pandas进行数据处理 (数据读取,数据清洗,数据处理,数据可视化)

目录

前言

一、pandas是什么?

主要特点:

二、使用步骤

[1. 环境准备和库引入](#1. 环境准备和库引入)

[2. 读取数据](#2. 读取数据)

示例1:从网络URL读取CSV数据

示例2:从本地文件读取数据

示例3:探索数据集

[3. 数据处理基础](#3. 数据处理基础)

数据清洗

数据选择和过滤

数据分组和聚合

[4. 数据可视化](#4. 数据可视化)

[5. 高级数据分析示例](#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及相关库。如果尚未安装,可以使用以下命令:

bash 复制代码
pip install pandas numpy matplotlib seaborn

接下来,在Python脚本或Jupyter Notebook中引入必要的库:

python 复制代码
# 引入数据处理和可视化库
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数据

python 复制代码
# 从网络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:从本地文件读取数据

python 复制代码
# 从本地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:探索数据集

python 复制代码
# 查看数据集信息
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 复制代码
```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个唯一值

数据选择和过滤

python 复制代码
# 选择特定列
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)}")

数据分组和聚合

python 复制代码
# 按教育水平分组计算平均年龄
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. 数据可视化

python 复制代码
# 创建图形
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. 高级数据分析示例

python 复制代码
# 创建收入分类的数值列
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()

三、实际案例:完整的数据分析流程

python 复制代码
# 完整的数据分析工作流程示例

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解决各种实际数据分析问题。

相关推荐
祝威廉4 小时前
摘下数据分析的皇冠:机器学习,InfiniSynapse 金融评分卡案例
人工智能·机器学习·金融·数据挖掘·数据分析
祁思妙想4 小时前
数据分析三剑客:NumPy、Pandas、Matplotlib
数据分析·numpy·pandas
SelectDB4 小时前
较 Trino 省 67% 成本,速度快 10 倍,中通快递基于 SelectDB 的湖仓分析架构
数据库·数据分析
xingzhemengyou15 小时前
python pandas操作excel
python·excel·pandas
asyxchenchong8885 小时前
联合物种分布模型HMSC——深入贝叶斯群落生态学分析,涵盖单物种与多物种建模、环境筛与生物筛解析、时空数据分析及系统发育整合等
经验分享·数据挖掘·数据分析
Katecat996635 小时前
基于显微镜图像的体液细胞分类与异常检测:改进RetinaNet模型实现
人工智能·分类·数据挖掘
deardao5 小时前
【对比语言-图像预训练】SuperCLIP:基于简单分类监督增强的 CLIP 模型
人工智能·分类·数据挖掘
我的offer在哪里5 小时前
开源的音视频元数据分析工具
数据挖掘·数据分析·音视频