news 2026/5/16 1:45:57

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据分析入门:使用pandas进行数据处理 (数据读取,数据清洗,数据处理,数据可视化)

目录

前言

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 10:28:59

Web Worker 与 SharedWorker 的区别:实现跨 Tab 页的 WebSocket 连接共享

各位技术同仁&#xff0c;大家好&#xff01;今天我们将深入探讨Web Worker和SharedWorker这两种强大的Web API&#xff0c;并着重讲解它们在实现跨多个浏览器Tab页共享WebSocket连接这一复杂场景中的应用。在现代Web应用中&#xff0c;实时通信已成为标配&#xff0c;而WebSoc…

作者头像 李华
网站建设 2026/5/15 16:11:20

YashanDB数据库的跨平台迁移策略及实操经验

YashanDB 是一个相对较新的数据库&#xff0c;关于它的跨平台迁移策略和实操经验的文档和资料可能不如一些成熟的数据库系统丰富&#xff0c;但可以参考一些通用数据库迁移的策略和经验&#xff0c;以下是一些关键点&#xff1a;跨平台迁移策略1. 评估现有环境&#xff1a;- 确…

作者头像 李华
网站建设 2026/5/12 15:55:21

Http概述

文章目录Web基础-HTTP1、什么是项目2、什么是架构&#xff1f;3、架构所需关键词4、什么是集群&#xff1f;5、什么是负载均衡&#xff1f;6、http概述6.1、Web状态访问码6.2、Web的结构组成6.3、有哪些Web资源&#xff1f;6.4、HTTP的工作原理6.5、HTTP请求响应6.6、HTTP相关术…

作者头像 李华
网站建设 2026/5/9 19:23:54

线性系统(非线性系统)

线性系统&#xff08;非线性系统&#xff09; 若任意x(t)–系统–>y(t) &#xff0c;则有ax(t)–系统–>ay(t)x1(t)–系统–>y1(t) x2(t)–系统–>y2(t) > x1(t) x2(t) --系统–> y1(t) y2(t)同时满足12 则是线性系统 齐次性 叠加性线性系统举例&#…

作者头像 李华
网站建设 2026/5/13 14:00:00

LaTeX公式转换终极指南:从网页到Word的完整解决方案

在学术写作和科研工作中&#xff0c;LaTeX公式与Word文档的格式转换一直是研究人员面临的常见挑战。传统方法需要手动重新输入复杂的数学表达式&#xff0c;不仅耗时费力&#xff0c;还容易引入错误。LaTeX2Word-Equation作为一款专业的Chrome扩展工具&#xff0c;完美解决了这…

作者头像 李华
网站建设 2026/5/15 22:30:04

飞书文档批量导出神器:跨平台高效备份解决方案

飞书文档批量导出神器&#xff1a;跨平台高效备份解决方案 【免费下载链接】feishu-doc-export 项目地址: https://gitcode.com/gh_mirrors/fe/feishu-doc-export 在数字化办公日益普及的今天&#xff0c;企业文档管理面临着前所未有的挑战。当公司从飞书切换到其他办公…

作者头像 李华