Python爬虫技术 第24节 数据清洗和预处理(二)
在Python爬虫项目中,数据清洗和预处理是非常关键的步骤。这部分工作通常涉及到字符串操作、缺失值处理和数据格式转换等方面。下面我将详细讲解这些方面的内容,并提供具体的代码示例。
1. 字符串操作
字符串操作在数据清洗过程中非常重要,因为网页内容通常包含大量的文本数据。常见的字符串操作包括去除空白字符、大小写转换、去除特殊字符等。
示例代码:
# 去除空白字符
def remove_whitespace(text):return text.strip()# 大小写转换
def to_lowercase(text):return text.lower()# 去除特殊字符
import re
def remove_special_chars(text):return re.sub(r'[^a-zA-Z0-9\s]', '', text)# 示例使用
text = " Hello, World! "
cleaned_text = remove_whitespace(text)
cleaned_text = to_lowercase(cleaned_text)
cleaned_text = remove_special_chars(cleaned_text)
print(cleaned_text) # 输出: hello world
2. 缺失值处理
在爬取数据时,有时会遇到缺失值的情况。缺失值可能出现在任何数据类型中,包括字符串、数字等。处理缺失值的方法通常包括删除含有缺失值的记录、填充缺失值等。
示例代码:
import pandas as pd# 创建一个包含缺失值的DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],'Age': [25, None, 30],'Email': ['alice@example.com', 'bob@example.com', None]
}
df = pd.DataFrame(data)# 删除含有缺失值的行
df_cleaned = df.dropna()# 使用特定值填充缺失值
df_filled = df.fillna(value='Unknown')# 使用前一个有效值填充缺失值
df_forward_filled = df.fillna(method='ffill')# 使用后一个有效值填充缺失值
df_backward_filled = df.fillna(method='bfill')# 使用统计方法(如均值)填充数值型列的缺失值
mean_age = df['Age'].mean()
df['Age'] = df['Age'].fillna(mean_age)# 显示结果
print(df_cleaned)
print(df_filled)
print(df_forward_filled)
print(df_backward_filled)
3. 数据格式转换
数据格式转换是指将数据从一种格式转换为另一种格式,这在处理日期、货币等数据时非常常见。Python 中有许多内置函数和第三方库可以帮助完成这项工作。
示例代码:
# 转换日期格式
from datetime import datetimedate_str = '2024-07-30'
date_obj = datetime.strptime(date_str, '%Y-%m-%d')
formatted_date = date_obj.strftime('%d/%m/%Y')
print(formatted_date) # 输出: 30/07/2024# 货币格式转换
price_str = '$1,234.56'
price_float = float(price_str.replace('$', '').replace(',', ''))
print(price_float) # 输出: 1234.56
总结
以上就是关于数据清洗和预处理中字符串操作、缺失值处理和数据格式转换的详细讲解及示例代码。在实际项目中,你可能需要根据具体情况调整这些步骤,以适应不同的数据来源和需求。
如果你有任何具体问题或需要进一步的帮助,请随时告诉我!
我们可以深入到一些更具体的细节,比如处理日期时间、正则表达式匹配、以及更复杂的缺失值处理策略等。接下来,我将给出一些额外的示例代码来展示这些操作。
1. 处理日期时间
在处理日期时间数据时,通常需要将它们转换为统一的格式,以便进行比较或计算。Python 中的 datetime 模块提供了强大的日期时间处理能力。
示例代码:
from datetime import datetime# 假设我们从网页中提取了日期字符串
date_strs = ['2024-07-30', '2024-08-01', '2024-08-02']# 将日期字符串转换为 datetime 对象
dates = [datetime.strptime(date, '%Y-%m-%d') for date in date_strs]# 将 datetime 对象转换回字符串,但格式不同
formatted_dates = [date.strftime('%d/%m/%Y') for date in dates]# 打印转换后的日期
print(formatted_dates) # 输出: ['30/07/2024', '01/08/2024', '02/08/2024']
2. 正则表达式匹配
正则表达式是用于文本模式匹配的强大工具。在数据清洗中,正则表达式可以用来提取特定格式的数据或去除不需要的部分。
示例代码:
import re# 假设我们有一段从网页中提取的文本
text = "The price is $1,234.56 and the date is 2024-07-30."# 提取价格
price_pattern = r'\$\d{1,3}(?:,\d{3})*\.\d{2}'
price_match = re.search(price_pattern, text)
price = price_match.group().replace('$', '').replace(',', '')# 提取日期
date_pattern = r'\d{4}-\d{2}-\d{2}'
date_match = re.search(date_pattern, text)
date = date_match.group()# 打印结果
print(price) # 输出: 1234.56
print(date) # 输出: 2024-07-30
3. 复杂的缺失值处理
除了简单的填充缺失值之外,还可以使用更复杂的方法来处理缺失数据,例如基于其他变量的预测填充、使用机器学习模型预测缺失值等。
示例代码:
import pandas as pd
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler# 创建一个包含缺失值的DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],'Age': [25, None, 30],'Email': ['alice@example.com', 'bob@example.com', None]
}
df = pd.DataFrame(data)# 使用中位数填充年龄列的缺失值
imputer = SimpleImputer(strategy='median')
age_imputed = imputer.fit_transform(df[['Age']])
df['Age'] = age_imputed# 使用众数填充电子邮件列的缺失值
email_imputer = SimpleImputer(strategy='most_frequent')
email_imputed = email_imputer.fit_transform(df[['Email']])
df['Email'] = email_imputed# 显示结果
print(df)
4. 综合示例
现在,让我们将上述所有的示例整合起来,创建一个更全面的数据清洗和预处理脚本。
示例代码:
import re
import pandas as pd
from datetime import datetime
from sklearn.impute import SimpleImputer# 定义数据清洗函数
def clean_data(df):# 去除字符串两端的空白字符df['Name'] = df['Name'].str.strip()# 转换年龄列的格式df['Age'] = df['Age'].astype(str).str.replace(',', '').astype(float)# 处理日期df['Date'] = df['Date'].apply(lambda x: datetime.strptime(x, '%Y-%m-%d').strftime('%d/%m/%Y'))# 使用正则表达式提取价格df['Price'] = df['Price'].apply(lambda x: re.search(r'\$\d{1,3}(?:,\d{3})*\.\d{2}', x).group())df['Price'] = df['Price'].str.replace('$', '').str.replace(',', '')# 使用中位数填充年龄列的缺失值imputer = SimpleImputer(strategy='median')df['Age'] = imputer.fit_transform(df[['Age']])# 使用众数填充电子邮件列的缺失值email_imputer = SimpleImputer(strategy='most_frequent')df['Email'] = email_imputer.fit_transform(df[['Email']])return df# 创建一个包含各种数据类型的DataFrame
data = {'Name': [' Alice ', 'Bob', 'Charlie'],'Age': ['25', None, 30],'Email': ['alice@example.com', 'bob@example.com', None],'Date': ['2024-07-30', '2024-08-01', '2024-08-02'],'Price': ['$1,234.56', 'The price is $1,234.56', 'Price: $1,234.56']
}
df = pd.DataFrame(data)# 清洗数据
df_cleaned = clean_data(df)# 显示结果
print(df_cleaned)
这个综合示例包含了从数据清洗到预处理的多种操作,包括字符串操作、缺失值处理、数据格式转换等。您可以根据自己的具体需求调整这些步骤。如果有任何疑问或需要进一步的帮助,请随时提问!
当然可以!既然您希望继续讨论数据清洗和预处理的话题,我们可以进一步探讨一些高级的主题,例如使用正则表达式进行更复杂的文本清洗、使用Pandas进行高级的数据处理操作,以及使用更高级的缺失值处理方法。
4. 使用正则表达式进行更复杂的文本清洗
正则表达式是一种非常强大的工具,可以用来进行复杂的文本匹配和替换。我们可以利用它来处理更复杂的文本清洗任务。
示例代码:
import re# 假设我们从网页中提取了一些文本数据
text = """
John Doe, 25 years old, lives at 123 Main St.
Jane Smith, 32 years old, lives at 456 Elm St.
"""# 使用正则表达式提取姓名和年龄
pattern = r'(\w+\s\w+), (\d+) years old'
matches = re.findall(pattern, text)# 将匹配结果转换为字典
result = [{'Name': name, 'Age': int(age)} for name, age in matches]# 打印结果
print(result)
# 输出: [{'Name': 'John Doe', 'Age': 25}, {'Name': 'Jane Smith', 'Age': 32}]
5. 使用Pandas进行高级的数据处理操作
Pandas 是一个非常强大的数据处理库,可以方便地处理数据框 (DataFrame) 和序列 (Series)。这里有一些使用 Pandas 进行数据清洗和预处理的高级示例。
示例代码:
import pandas as pd# 创建一个包含混合数据类型的 DataFrame
data = {'Name': ['John Doe', 'Jane Smith', 'None', ''],'Age': [25, 32, None, 28],'Email': ['john@example.com', 'jane@example.com', None, '']
}
df = pd.DataFrame(data)# 使用 Pandas 的函数进行数据清洗和预处理
# 替换空字符串为 NaN
df = df.replace('', pd.NA)# 使用 fillna() 方法处理缺失值
# 使用 'Unknown' 填充 Name 列的缺失值
df['Name'] = df['Name'].fillna('Unknown')# 使用 Age 列的平均值填充 Age 列的缺失值
df['Age'] = df['Age'].fillna(df['Age'].mean())# 使用 Email 列的众数填充 Email 列的缺失值
df['Email'] = df['Email'].fillna(df['Email'].mode()[0])# 打印处理后的 DataFrame
print(df)
6. 使用更高级的缺失值处理方法
在处理缺失值时,除了简单的填充或删除外,还可以使用更高级的方法,例如基于其他变量的预测填充、使用机器学习模型预测缺失值等。
示例代码:
import pandas as pd
from sklearn.impute import KNNImputer# 创建一个包含缺失值的 DataFrame
data = {'Name': ['John Doe', 'Jane Smith', 'None', ''],'Age': [25, 32, None, 28],'Email': ['john@example.com', 'jane@example.com', None, '']
}
df = pd.DataFrame(data)# 使用 KNNImputer 基于其他特征预测 Age 列的缺失值
imputer = KNNImputer(n_neighbors=2)
df['Age'] = imputer.fit_transform(df[['Age']])# 使用 Email 列的众数填充 Email 列的缺失值
df['Email'] = df['Email'].fillna(df['Email'].mode()[0])# 打印处理后的 DataFrame
print(df)
7. 结合所有操作
最后,我们可以将前面的所有操作整合到一个完整的脚本中,以便更系统地处理数据。
示例代码:
import re
import pandas as pd
from sklearn.impute import KNNImputer# 定义数据清洗函数
def clean_data(df):# 使用正则表达式清洗姓名df['Name'] = df['Name'].apply(lambda x: re.sub(r'\s+', ' ', x).strip())# 使用 KNNImputer 基于其他特征预测 Age 列的缺失值imputer = KNNImputer(n_neighbors=2)df['Age'] = imputer.fit_transform(df[['Age']])# 使用 Email 列的众数填充 Email 列的缺失值df['Email'] = df['Email'].fillna(df['Email'].mode()[0])return df# 创建一个包含各种数据类型的 DataFrame
data = {'Name': [' John Doe ', 'Jane Smith', 'None', ''],'Age': [25, 32, None, 28],'Email': ['john@example.com', 'jane@example.com', None, '']
}
df = pd.DataFrame(data)# 清洗数据
df_cleaned = clean_data(df)# 显示结果
print(df_cleaned)
这些示例涵盖了使用正则表达式进行复杂的文本清洗、使用 Pandas 进行高级的数据处理操作,以及使用更高级的缺失值处理方法。这些技巧可以帮助您更有效地清洗和预处理数据。如果您有更具体的需求或问题,请随时提出!
相关文章:
Python爬虫技术 第24节 数据清洗和预处理(二)
在Python爬虫项目中,数据清洗和预处理是非常关键的步骤。这部分工作通常涉及到字符串操作、缺失值处理和数据格式转换等方面。下面我将详细讲解这些方面的内容,并提供具体的代码示例。 1. 字符串操作 字符串操作在数据清洗过程中非常重要,因…...
conda常用命令整理
Anaconda是一个流行的Python和R编程语言的开源发行版,用于科学计算和数据分析。它包含了许多常用的开源软件包和工具,适用于数据科学、机器学习、大数据处理和科学计算等领域。Anaconda的核心是conda。conda是一个包管理器和环境管理器,可以轻…...
JDK8新特性之Lambda表达式快速入门
目录标题 为什么使用 Lambda 表达式示例一:先看一个常用排序类Comparator的示例示例二:筛选员工数据的示例传统方式实现的示例策略模式优化的示例 Lambda 基础语法语法格式一:无参数,无返回值语法格式二:有一个参数&am…...
QEMU源码全解析 —— CPU虚拟化(14)
接前一篇文章: 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 《深度探索Linux系统虚拟化原理与实现》—— 王柏生 谢广军, 机械工业出版社 特此致谢! 三、KVM模块初始化介绍 2. KVM模块初始化 KV…...
libsoup的简单使用
基于GLib和libsoup的简单Web服务器示例,它可以处理静态HTML文件和动态JSON请求,并展示如何获取URL参数。 步骤: 初始化GLib和libsoup。创建一个处理静态HTML文件的处理器。创建一个处理动态JSON请求的处理器。获取URL参数并在JSON响应中返回…...
electron项目搭建
前言:electron是一个跨平台桌面端应用开发工具。它将整个系统内容分为主进程和渲染进程两个部分(你可以粗略的理解为electron项目开启了两个服务器,一个渲染页面另一个处理electron窗口内容)。这两个"服务器"之间通过JS Bridge进行通信(即&…...
【CVPR2024】Efficient LoFTR: 高效的 LoFTR:具有类似稀疏的速度的半密集局部特征匹配
Efficient LoFTR: 高效的 LoFTR:具有类似稀疏的速度的半密集局部特征匹配 Efficient LoFTR realtime_demo 0.摘要 \qquad 我们提出了一种新的方法来有效地产生跨图像的半密集匹配。以往的无探测器匹配器LoFTR在处理大视点变化和纹理差的场景下表现出了出色的匹配能力…...
【Golang 面试 - 基础题】每日 5 题(九)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...
《程序猿入职必会(4) · Vue 完成 CURD 案例 》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...
编程技巧:如何优雅地合并两个有序数组?
目录 题目引用描述1.直接合并 排序2.指针3.后逆向双指针进阶:你可以设计实现一个时间复杂度为 O(m n) 的算法解决此问题吗?总结 题目 来自力扣 引用 合并两个有序数组 给你两个按 **非递减顺序 **排列的整数数组 nums1 和 nums2,另有两个整…...
Vue组件库移动端预览实现原理
引言 大家如果使用过移动端组件库(比如:Vant),会发现在网站右侧有一个手机端的预览效果。 而且这个手机端预览的内容和外面的组件代码演示是同步的,切换组件的时候,移动端预览的内容也会发生相应的变化。 …...
FastAPI(七十五)实战开发《在线课程学习系统》接口开发-- 创建课程
源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 上次我们分享了,FastAPI(七十四)实战开发《在线课程学习系统》接口开发-- 删除留言 从本篇文章开始,…...
【C++】 条件变量实现线程同步示例
在做一些比较大的项目的时候,需要实现线程同步, 这里结合一个小示例,进行线程同步的讲解 问题定义 以下是一个使用 C 多线程和条件变量的示例,展示了线程 A 接收一个 enable 信号并通知线程 B 开始工作。线程 B 在开始工作之前…...
linux下载redis安装并指定配置文件启动
linux下载redis并安装启动: cd /usr/local/src 下载redis压缩包 wget http://download.redis.io/releases/redis-6.2.6.tar.gz 解压 tar -xzf redis-6.2.6.tar.gz 编译和安装redis make make install 安装完成后进入 redis 安装目录 cd /usr/local/bin 修改…...
线性结构、线性表、顺序表、链表、头插法、尾插法、中间插入或删除一个节点
梳理几个名词: 逻辑地址:就是说是第几个元素。 物理地址:也就是存储地址,在计算机里具体存放的位置。 线性表的存储结构分为: (1)顺序存储结构:将数据依次存储在连续的整块物理空…...
C# Task.WaitAll 的用法
目录 简介 1.WaitAll(Task[], Int32, CancellationToken) 2.WaitAll(Task[]) 3.WaitAll(Task[], Int32) 4.WaitAll(Task[], CancellationToken) 5.WaitAll(Task[], TimeSpan) 结束 简介 Task.WaitAll 是 C# 中用于并行编程的一个的方法,它属于 System.Threa…...
vue2 前端实现pdf在线预览(无插件版)
toFielDetail()是点击预览的方法,getOfficialFile是获取文件流的接口正常定义即可: export function getOfficialFile(query) {return request({url: /dataAsset/projectassess/getOfficialFile,method: get,params: query,}); } 调用接口的页面需要引用…...
排序XXXXXXXXX
信息学奥赛|常见排序算法总结(C+) - 腾讯云开发者社区-腾讯云 (tencent.com) https://cloud.tencent.com/developer/news/975232 常用序号层级排序 一、序号 序号Sequence Number,有顺序的号码,如数字序号…...
【文件解析漏洞】实战详解!
漏洞描述: 文件解析漏洞是由于中间件错误的将任意格式的文件解析成网页可执行文件,配合文件上传漏洞进行GetShell的漏洞! IIS解析漏洞: IIS6.X: 方式一:目录解析 在网站下建立文件夹的名字为.asp/.asa 的文件夹,其目…...
【杂谈】学会让你节省三秒钟——Dev-c++的缺省源
【杂谈】学会让你节省三秒钟——Dev-c的缺省源 1.前言2.缺省源的介绍3.注意 1.前言 你是否在为每次写程序都要自己手打一遍框架而感到苦恼?为什么大佬的Dev-C一新建文件就会自动出现程序框架?看完这篇文章,让你也能成为大佬,不用再…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
