Python 爬虫入门(四):使用 pandas 处理和分析数据 「详细介绍」

news2024/9/9 4:38:10

Python 爬虫入门(四):使用 pandas 处理和分析数据 「详细介绍」

  • 前言
    • 1. pandas简介
      • 1.1 什么是pandas?
      • 1.2 为什么要使用pandas?
      • 1.3 安装 Pandas
    • 2. pandas的核心概念
      • 2.1 Series
      • 2.2 DataFrame
      • 2.3 索引
    • 3. 数据导入和导出
      • 3.1 从CSV文件读取数据
      • 3.2 从Excel文件读取数据
      • 3.3 导出数据到CSV
      • 3.4 导出数据到Excel
    • 4. 数据清洗
      • 4.1 处理缺失值
      • 4.2 删除重复数据
      • 4.3 重命名列
    • 5. 数据转换
      • 5.1 选择和过滤
      • 5.2 排序
      • 5.3 分组和聚合
      • 5.4 合并数据
    • 6. 时间序列操作
      • 6.1 创建日期范围
      • 6.2 重采样
      • 6.3 移动窗口计算
    • 7. 数据可视化
      • 7.1 绘制折线图
      • 7.2 绘制柱状图
      • 7.3 绘制散点图
    • 8. 高级功能
      • 8.1 多层索引
      • 8.2 透视表
      • 8.3 类别数据
    • 9. 性能优化
      • 9.1 使用适当的数据类型
      • 9.2 使用迭代器处理大数据集
      • 9.3 使用内置的矢量化操作
    • 10. 实战案例:分析爬虫数据
      • 10.1 导入数据
      • 10.2 数据清洗
      • 10.3 数据分析
      • 10.4 数据可视化
      • 10.5 导出结果
    • 11. 注意事项和最佳实践
  • 总结

前言

  • 欢迎来到"Python 爬虫入门"系列的第四篇文章。在前面的教程中,我们学习了如何抓取网页数据。但是获取数据只是第一步,如何高效地处理和分析这些数据同样重要。这就是我们今天要学习的内容 - 使用pandas库进行数据处理。
  • pandas是Python中最强大的数据分析工具之一。它提供了高性能、易用的数据结构和数据分析工具。不管你是数据科学家、金融分析师,还是网络爬虫开发者,pandas都是一个不可或缺的工具。
  • 在这篇文章里,我们会深入探讨pandas的核心概念,学习如何使用pandas处理爬虫获取的数据,以及如何进行数据清洗、转换和分析。即使你是pandas新手,也不用担心,我们会从最基础的知识开始,一步步带你掌握pandas的使用技巧。

1. pandas简介

1.1 什么是pandas?

pandas是一个开源的,BSD许可的库,为Python编程语言提供高性能,易于使用的数据结构和数据分析工具。

pandas的名字来源于"panel data"(面板数据)的缩写,最初是为了处理金融数据而开发的。但是,由于其强大的功能和灵活性,它很快成为了各个领域数据分析的首选工具。

1.2 为什么要使用pandas?

pandas为数据处理提供了许多优势:

  1. 高效的数据结构: pandas提供了DataFrame和Series等数据结构,可以高效地处理大量数据。

  2. 数据清洗: pandas提供了丰富的工具来处理缺失数据、重复数据等常见问题。

  3. 数据转换: 可以轻松地重塑数据,进行聚合、合并等操作。

  4. 时间序列功能: 对于时间序列数据,pandas提供了专门的处理工具。

  5. 与其他库的集成: pandas可以很好地与NumPy、Matplotlib等其他科学计算库集成。

1.3 安装 Pandas

通过 pip 来安装:

pip install pandas

如果你使用的是 Anaconda 环境,Pandas 可能已经预装好了,如果没有,你也可以使用 conda 来安装:

conda install pandas

如果不确定是否已经安装了 Pandas 或者想要检查其版本,可以使用以下命令:

pip show pandas

2. pandas的核心概念

2.1 Series

Series是pandas中的一维标记数组,可以存储各种数据类型(整数、浮点数、字符串等)。

import pandas as pd

# 创建一个Series
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)

输出:
在这里插入图片描述

2.2 DataFrame

DataFrame是一个二维标记数据结构,有列和索引。你可以把它看作是一个Excel表格或SQL表。

# 创建一个DataFrame
df = pd.DataFrame({
    'A': [1, 2, 3, 4],
    'B': pd.Timestamp('20130102'),
    'C': pd.Series(1, index=list(range(4)), dtype='float32'),
    'D': np.array([3] * 4, dtype='int32'),
    'E': pd.Categorical(["test", "train", "test", "train"]),
    'F': 'foo'
})

print(df)

输出:
在这里插入图片描述

2.3 索引

索引是pandas中非常重要的概念。它允许你通过标签来访问数据,而不仅仅是通过位置。

# 使用索引访问数据
print(df['A'])
print(df.loc[0])

3. 数据导入和导出

3.1 从CSV文件读取数据

# 从CSV文件读取数据
df = pd.read_csv('data.csv')

3.2 从Excel文件读取数据

# 从Excel文件读取数据
df = pd.read_excel('data.xlsx')

3.3 导出数据到CSV

# 导出数据到CSV
df.to_csv('output.csv', index=False)

3.4 导出数据到Excel

# 导出数据到Excel
df.to_excel('output.xlsx', index=False)

4. 数据清洗

4.1 处理缺失值

# 删除包含缺失值的行
df.dropna()

# 填充缺失值
df.fillna(value=5)

4.2 删除重复数据

# 删除重复行
df.drop_duplicates()

4.3 重命名列

# 重命名列
df.rename(columns={'old_name': 'new_name'})

5. 数据转换

5.1 选择和过滤

# 选择特定的列
df[['A', 'B']]

# 根据条件过滤行
df[df['A'] > 0]

5.2 排序

# 按值排序
df.sort_values('B')

# 按索引排序
df.sort_index()

5.3 分组和聚合

# 分组并计算平均值
df.groupby('A').mean()

5.4 合并数据

# 合并两个DataFrame
pd.concat([df1, df2])

# 基于键合并
pd.merge(df1, df2, on='key')

6. 时间序列操作

6.1 创建日期范围

# 创建日期范围
dates = pd.date_range('20130101', periods=6)

6.2 重采样

# 将日数据重采样为月数据
df.resample('M').mean()

6.3 移动窗口计算

# 计算移动平均
df['A'].rolling(window=3).mean()

7. 数据可视化

pandas与Matplotlib无缝集成,可以轻松创建各种图表。

7.1 绘制折线图

df.plot(kind='line')

7.2 绘制柱状图

df.plot(kind='bar')

7.3 绘制散点图

df.plot(kind='scatter', x='A', y='B')

8. 高级功能

8.1 多层索引

多层索引允许你在一个轴上有多个索引级别。

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
          ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
index = pd.MultiIndex.from_arrays(arrays, names=('first', 'second'))
df = pd.DataFrame(np.random.randn(8, 4), index=index, columns=['A', 'B', 'C', 'D'])
print(df)

8.2 透视表

透视表是一种汇总统计的方式,可以快速创建交叉表。

df = pd.DataFrame({"A": ["foo", "foo", "foo", "bar", "bar", "bar"],
                   "B": ["one", "one", "two", "two", "one", "one"],
                   "C": ["x", "y", "x", "y", "x", "y"],
                   "D": [1, 3, 2, 5, 4, 1]})

table = pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'])
print(table)

8.3 类别数据

pandas提供了Categorical数据类型,用于处理类别变量。

df = pd.DataFrame({"id":[1,2,3,4,5,6], "raw_grade":['a', 'b', 'b', 'a', 'a', 'e']})
df["grade"] = df["raw_grade"].astype("category")
print(df["grade"])

9. 性能优化

9.1 使用适当的数据类型

选择正确的数据类型可以显著提高性能和减少内存使用。

df = pd.DataFrame({'a': np.random.randint(0, 100, 100000)})
df['b'] = df['a'].astype('int8')
print(df.memory_usage())

9.2 使用迭代器处理大数据集

对于非常大的数据集,可以使用迭代器来避免一次性将所有数据加载到内存。

chunksize = 10000
for chunk in pd.read_csv('large_file.csv', chunksize=chunksize):
    # 处理每一个chunk
    process(chunk)

9.3 使用内置的矢量化操作

尽可能使用pandas的内置函数和方法,而不是Python的循环。

# 不推荐
for i in range(len(df)):
    df.loc[i, 'new_col'] = df.loc[i, 'col1'] + df.loc[i, 'col2']

# 推荐
df['new_col'] = df['col1'] + df['col2']

10. 实战案例:分析爬虫数据

让我们用一个实际的例子来综合运用我们学到的知识。假设我们已经从一个电商网站爬取了一些产品数据,现在要对这些数据进行分析。

10.1 导入数据

import pandas as pd
import matplotlib.pyplot as plt

# 假设我们的数据保存在products.csv文件中
df = pd.read_csv('products.csv')
print(df.head())

10.2 数据清洗

# 删除缺失值
df.dropna(inplace=True)

# 将价格转换为数值类型
df['price'] = pd.to_numeric(df['price'].str.replace('$', ''), errors='coerce')

# 删除重复数据
df.drop_duplicates(inplace=True)

10.3 数据分析

# 计算每个类别的平均价格
category_avg_price = df.groupby('category')['price'].mean().sort_values(ascending=False)
print(category_avg_price)

# 找出评分最高的10个产品
top_rated = df.nlargest(10, 'rating')
print(top_rated[['name', 'rating']])

# 计算价格和评分的相关性
correlation = df['price'].corr(df['rating'])
print(f"价格和评分的相关系数: {correlation}")

10.4 数据可视化

# 绘制类别平均价格的条形图
plt.figure(figsize=(12,6))
category_avg_price.plot(kind='bar')
plt.title('Average Price by Category')
plt.xlabel('Category')
plt.ylabel('Average Price')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

# 绘制价格和评分的散点图
plt.figure(figsize=(10,6))
plt.scatter(df['price'], df['rating'])
plt.title('Price vs Rating')
plt.xlabel('Price')
plt.ylabel('Rating')
plt.show()

10.5 导出结果

# 将分析结果导出到Excel文件
with pd.ExcelWriter('analysis_results.xlsx') as writer:
    category_avg_price.to_excel(writer, sheet_name='Category Avg Price')
    top_rated[['name', 'rating']].to_excel(writer, sheet_name='Top Rated Products')

11. 注意事项和最佳实践

  1. 内存管理: 处理大数据集时要注意内存使用。使用chunksize参数分批读取数据,或者使用适当的数据类型来减少内存占用。

  2. 性能优化: 尽量使用向量化操作而不是循环,这样可以显著提高性能。

  3. 数据类型: 选择合适的数据类型可以提高性能并节省内存。例如,对于整数列,可以使用int8或int16而不是默认的int64。

  4. 索引: 合理使用索引可以提高查询和排序的性能。但是,过多的索引也会增加内存使用和数据修改的开销。

  5. 处理大文件: 对于非常大的文件,考虑使用迭代器或分块处理,而不是一次性将整个文件加载到内存中。

  6. 数据清洗: 在进行任何分析之前,一定要仔细检查和清洗数据。处理缺失值、异常值和重复数据是很重要的步骤。

  7. 文档和注释: 为你的代码添加清晰的注释和文档,这对于后续的维护和协作非常重要。

  8. 版本兼容性: 注意pandas的版本兼容性问题。某些函数和方法可能在不同版本中有所变化。

  9. 数据备份: 在对数据进行修改操作之前,最好先备份原始数据。

  10. 定期保存: 在处理大量数据或进行长时间运算时,定期保存中间结果是个好习惯。

总结

通过这篇文章的学习,相信你应该能够更深入地理解pandas的功能,并能够将其应用于自己的项目中,以提高数据处理和分析的效率和效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1961289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp app跳小程序详细配置

应用场景 app跳微信小程序,支付等 前提配置 1.1微信开放平台申请移动应用 1.2关键:开放平台的移动应用的app的包名和签名必须和uniapp app的包名一致 1.3查看unaipp app的包的签名 下载工具:GenSignature,模拟器安装工具 ht…

iframe嵌套项目后,接口跳出登入页面(会出现画中画的场景)

iframe嵌套项目后,接口跳出登入页面(会出现画中画的场景) JavaScript 跳出iframe框架 window.top top 属性返回最顶层的先辈窗口。该属性返回对一个顶级窗口的只读引用。如果窗口本身就是一个顶级窗口,top 属性存放对窗口自身的…

使用DTW算法简单实现曲线的相似度计算

相对接近产品交付形态的实现:基于DTW距离的KNN算法实现股票高相似筛选案例-CSDN博客 一、问题背景和思路 问题背景:如果你有历史股票的K线图,怎么从众多股票K线图中提取出TopN相似的几支股票,用来提供给投资者或专家做分析、决策…

任意空间平面点云旋转至与水平面平行(python)

1、背景介绍 将三维空间中位于任意平面上的点云数据,通过一系列的坐标变换(平移旋转),使其投影到与XOY平面平行,同时点云形状保持不变。具体效果如下,对于原始点集(蓝色点集)&#x…

关于 AGGLIGATOR(猛禽)网络宽频聚合器

AGGLIGATOR 是一个用于多个链路UDP/IP带宽聚合的工具软件,类似MTCP的作用,不过它是针对UDP/IP宽频聚合的。 举个例子: 中国大陆有三台公网服务器,中国香港有一台大带宽服务器。 那么: AGGLIGATOR 允许中国大陆的客户…

【C++高阶】:深入探索C++11

✨ 心似白云常自在,意如流水任东西 🌏 📃个人主页:island1314 🔥个人专栏:C学习 🚀 欢迎关注:👍点赞 &#x1f4…

Prometheus+Grafana+Alertmanager监控告警

PrometheusGrafanaAlertmanager告警 Alertmanager开源地址:github.com/prometheus Prometheus是一款基于时序数据库的开源监控告警系统,它是SoundCloud公司开源的,SoundCloud的服务架构是微服务架构,他们开发了很多微服务&#xf…

【实际源码】工厂进销存管理系统(仓库、采购、生产、销售)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程&#xff…

亚马逊云科技 re:Inforce 2024中国站大会

亚马逊云科技 re:Inforce 2024中国站大会 - 生成式AI时代的全面安全,将于7月25日本周四在北京富力万丽酒店揭幕

向量数据库(二):Qdrant

写在前面 我们借助 Qdrant 来了解向量数据库的一些内容 内容 什么是 Qdrant? Qdrant 是一个开源的针对向量相似性搜索的引擎,它提供了一系列的 API 用于对向量数据进行存储、搜索和管理等功能。 下面是来自 Qdrant 官网的一个架构图: 初步了解 Qdrant 里的一些概念 …

h5页面 打开自动跳转小程序

移动端项目中打开页面&#xff0c;直接跳转到小程序功能效果图 pc mobile 代码 样式代码css&#xff1a; <style>* {margin: 0;padding: 0;}html,body {height: 100%;}.full {position: absolute;top: 0;bottom: 0;left: 0;right: 0;}.public-web-container {displa…

每日OJ_牛客CM26 二进制插入

目录 牛客CM26 二进制插入 解析代码 牛客CM26 二进制插入 二进制插入_牛客题霸_牛客网 解析代码 m:1024&#xff1a;100000000 00 n:19 &#xff1a; 10011 要把n的二进制值插入m的第j位到第i位&#xff0c;只需要把n先左移j位&#xff0c;然后再进行或运算&#xff08;|&am…

JS知识点巩固

目录 前言 一、reduce方法 二、二维数组的行和列交换 总结 前言 这里的知识点记录的是日常生活中容易搞忘的知识点 一、reduce方法 function(total,currentValue, index,arr) redece可以用作累加&#xff1a;可以传入初始值&#xff0c;如果传入初始值&#xff0c;则从累加…

【FAS】《The Research of RGB Image Based Face Anti-Spoofing》

文章目录 1、原文2、相关工作3、基于特征解耦的人脸活体检测算法3.1、方法3.2、实验结果 4、基于解构与组合的人脸活体检测方法4.1、方法4.2、实验 5、作者总结6、结论&#xff08;own&#xff09;7、附录7.1、CycleGAN7.2、InfoGAN7.3、3D Face 1、原文 [1]张克越.基于RGB图像…

项目成功秘诀:工单管理系统如何加速进程

国内外主流的10款项目工单管理系统对比&#xff1a;PingCode、Worktile、浪潮云工单管理系统、华为企业智能工单系统、金蝶云苍穹、紫光软件管理系统、Jira、Asana、ServiceNow、Smartsheet。 在管理日益复杂的个人项目时&#xff0c;找到一款能够真正符合需求的管理软件&#…

Stable Diffusion 图生图

区别于文生图&#xff0c;所谓的图生图&#xff0c;俗称的垫图&#xff0c;就是比文生图多了一张参考图&#xff0c;由参考一张图来生成图片&#xff0c;影响这个图片的要素不仅只靠提示词了&#xff0c;还有这个垫图的因素&#xff0c;这个区域就上上传垫图的地方&#xff0c;…

二叉树--堆(下卷)

二叉树–堆&#xff08;下卷&#xff09; 如果有还没看过上卷的&#xff0c;可以看这篇&#xff0c;链接如下&#xff1a; http://t.csdnimg.cn/HYhax 向上调整算法 堆的插⼊ 将新数据插⼊到数组的尾上&#xff0c;再进⾏向上调整算法&#xff0c;直到满⾜堆。 &#x1f4…

Monaco 使用 LinkedEditingRangeProvider

Monaco LinkEdit 功能是指同时修改同样的字符串&#xff0c;例如在编辑 Html 时&#xff0c;修改开始标签时会同时修改闭合标签。Monaco 支持自定义需要一起更新的字符串列表。最终效果如下&#xff1a; 首先&#xff0c;通过 registerLinkedEditingRangeProvider 注册 LinkEd…

day17(nginx反向代理)

反向代理 安装nginx 1.26.1 平滑升级 负载均衡 1.nginx 反向代理配置 反向代理&#xff1a;⽤户直接访问反向代理服务器就可以获得⽬标服务器 &#xff08;后端服务器&#xff09;的资源。 反向代理效果&#xff1a;当访问200主机&#xff08;web1&#xff09;&#xff0c;&a…

vite instanceof 失效

背景&#xff1a;给一个巨石单体项目进行标准化模块拆分&#xff0c;封装出来的模块代码用 vite 进行构建&#xff0c;但模块启动后页面上的表现一直和 webpack 那版不一致 一步步 debug 后&#xff0c;发现问题出在下面这个判断条件 const GeneratorFunction function* () …