Python 如何对上万、百万、亿级数据去重?

大家好!我是爱摸鱼的小鸿,关注我,收看每期的编程干货。

今天我们要一起探索一个让数据工程师、数据科学家和开发者们都头疼的问题:如何对海量数据进行去重。随着数据量的不断增长,我们在处理数据时,去重操作变得愈发重要且复杂。那么,Python 是如何帮助我们高效地对上万、百万,甚至亿级数据进行去重的呢?

目录

    • 一、初识数据去重
    • 二、小规模数据去重
    • 三、中规模数据去重:万级数据
    • 四、大规模数据去重:百万级数据
    • 五、超大规模数据去重:亿级数据
    • 六、总结
    • 七、作者Info

一、初识数据去重

在开始之前,我们先来简单了解一下什么是数据去重。数据去重,顾名思义,就是从数据集中移除重复的元素,保留唯一的元素。

这看似简单的操作,在面对海量数据时,却充满了挑战。那么,Python 能帮我们做些什么呢?答案是:很多!

二、小规模数据去重

我们先从小规模数据说起,感受一下去重的简单和乐趣。假设我们有一个包含重复元素的列表,我们可以使用 Python 的集合(set)来轻松去重:

data = [1, 2, 2, 3, 4, 4, 5]
unique_data = list(set(data))
print(unique_data)

运行结果:

[1, 2, 3, 4, 5]

集合是无序且唯一的,因此将列表转换为集合再转换回列表,就实现了去重。这种方法简单高效,适用于小规模数据。

三、中规模数据去重:万级数据

当数据量达到万级时,直接使用集合去重依然有效,但我们需要考虑内存和性能问题。在这种情况下,我们可以借助 pandas 库来处理。pandas 不仅提供了强大的数据处理功能,还能有效利用内存。

import pandas as pddata = [1, 2, 2, 3, 4, 4, 5] * 1000  # 模拟万级数据
df = pd.DataFrame(data, columns=["value"])
unique_df = df.drop_duplicates()
print(unique_df.head())

pandas 的 drop_duplicates() 方法非常高效,能够在保证数据顺序的同时进行去重。这对于数据分析和处理非常有用。

但如果列表里面是字典呢?例如下面这样的数据:

all_data_list = [{'_id':'007', 'name': 'makerchen66'},{'_id': '007': 'name': 'makerchen66'},{'_id': '008', 'name': 'dahuang'},
]

除了利用 pandas 的 drop_duplicates() 方法,还可以用下面这种妙招:

all_data_list = [eval(i) for i in set([str(data) for data in all_data_list])]

你没看错,这也能成:

[{'_id': '007', 'name': 'makerchen66'}, {'_id': '008', 'name': 'dahuang'}]


四、大规模数据去重:百万级数据

当数据量达到百万级时,我们需要更高效的解决方案。pandas 依然是一个不错的选择,但在某些场景下,我们可能需要分块处理数据,以减少内存占用。

分块处理
使用 pandas 的 read_csv() 方法,我们可以按块读取数据,逐块去重,再合并结果:

chunk_size = 100000
chunks = pd.read_csv("large_data.csv", chunksize=chunk_size)unique_data = pd.DataFrame()
for chunk in chunks:unique_chunk = chunk.drop_duplicates()unique_data = pd.concat([unique_data, unique_chunk])unique_data = unique_data.drop_duplicates()
print(unique_data.head())

通过分块处理,我们可以有效控制内存占用,避免内存不足的问题。

使用 Dask
除了 pandas,我们还可以使用 Dask 来处理大规模数据。Dask 是一个并行计算库,它能让你使用 pandas 一样的代码处理比内存大的数据集。

import dask.dataframe as dddf = dd.read_csv("large_data.csv")
unique_df = df.drop_duplicates().compute()
print(unique_df.head())

Dask会将数据分块处理,并在后台自动管理内存和并行计算,从而高效地完成去重操作。

五、超大规模数据去重:亿级数据

当数据量达到亿级时,我们需要更加专业的工具和方法。此时,使用分布式计算框架如 Apache Spark 会是一个不错的选择。Spark 的 PySpark 接口让我们能够在 Python 中轻松使用 Spark 的强大功能。

使用 PySpark
首先,我们需要安装并配置 PySpark。在安装好 PySpark后,我们可以使用如下代码进行数据去重:

from pyspark.sql import SparkSession# 初始化SparkSession
spark = SparkSession.builder.appName("DeDuplication").getOrCreate()# 读取数据
df = spark.read.csv("large_data.csv", header=True, inferSchema=True)# 去重
unique_df = df.dropDuplicates()
unique_df.show()# 保存去重后的数据
unique_df.write.csv("unique_data.csv", header=True)

Spark 能够处理分布式数据集,利用多节点并行计算,大大提高了处理速度和效率。

使用 Bloom Filter
对于一些特定的应用场景,我们还可以使用布隆过滤器(Bloom Filter)来进行高效去重。布隆过滤器是一种概率型数据结构,能够以较低的内存开销实现近似去重。

from pybloom_live import BloomFilter# 初始化布隆过滤器
bf = BloomFilter(capacity=100000000, error_rate=0.001)# 模拟数据流
data_stream = (i for i in range(100000000))# 去重
unique_data = []
for item in data_stream:if item not in bf:bf.add(item)unique_data.append(item)print(len(unique_data))

布隆过滤器虽然不能保证百分之百的准确性,但在内存和时间复杂度上具有很大的优势,特别适合处理超大规模数据。

六、总结

在这篇文章中,我们探索了如何使用 Python 对上万、百万、亿级数据进行去重。从简单的集合去重,到使用 pandas 和 Dask 处理大规模数据,再到利用分布式计算框架 Spark 和布隆过滤器处理超大规模数据,Python 为我们提供了丰富的工具和方法。

无论你是处理日常的数据清洗工作,还是构建复杂的数据管道,合理选择和使用这些工具,能够大大提高你的工作效率,确保数据处理的准确性和高效性。

在这里插入图片描述

七、作者Info

Author:小鸿的摸鱼日常

Goal:让编程更有趣! 专注于 Web 开发、爬虫,游戏开发,数据分析、自然语言处理,AI 等,期待你的关注,让我们一起成长、一起 Coding!

版权说明:本文禁止抄袭、转载,侵权必究!

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

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

相关文章

要么利用规则,要么打破规则

在这个充满规则和标准的世界里,我们常常被告知要如何生活、如何成功。但事实上,这些规则和标准往往限制了我们的潜力和创造力。本文将探讨如何不被外界规则所束缚,活出自己的风采。 规则的双刃剑 规则和标准可以为社会带来秩序,…

JavaScript进阶之构造函数数据常用函数

目录 一、深入对象1.1 创建对象的三种方式1.2 构造函数1.3 实例成员&静态成员 二、内置构造函数2.1 Object2.2 Array2.3 String常见实例方法2.4 Number 一、深入对象 1.1 创建对象的三种方式 利用对象字面量创建对象利用new object创建对象 const obj new Object({})利用…

SAP 如何修改统驭科目类型

在SAP中,科目设置错了统驭科目类型并且记账了要如何修改? 例如:前期应收账款对应的统驭科目类型前期设置成了供应商,并且供应商用该科目过来账,现在需要调整,想要将供应商调整到客户,科目为当前…

Java | Leetcode Java题解之第268题丢失的数字

题目&#xff1a; 题解&#xff1a; class Solution {public int missingNumber(int[] nums) {int n nums.length;int total n * (n 1) / 2;int arrSum 0;for (int i 0; i < n; i) {arrSum nums[i];}return total - arrSum;} }

ros2--QOS--通信质量

在ros2通信编程中&#xff0c;总有一个和qos相关的参数&#xff1a; publisher: template<typename MessageT, typename AllocatorT, typename PublisherT> std::shared_ptr<PublisherT> Node::create_publisher(const std::string & topic_name,const rclcp…

Linux安装Redis5.0镜像、Mysql8.0镜像

docker 安装Redis &#xff08;全网最详细&#xff1a;附带配置文件&#xff09;_docker pull redis-CSDN博客 Docker实用-安装Mysql8 - 简书 改动&#xff1a; 指定&#xff1a;docker pull mysql:8.0 docker run -d -p 3306:3306 \ --restartalways \ --privilegedtrue \…

088、Python 读取Excel文件及一些操作(使用xlwtxlrd库)

要读取Excel文件&#xff0c;我们需要使用第三方库。 xlrd库是一个常用的读取Excel的第三方库&#xff0c;它同时支持.xls和.xlsx&#xff0c;不过xlrd从版本2.0.0开始不再支持.xlsx的读取&#xff0c;需要单独使用openpyxl。 要使用第三方库&#xff0c;首选需安装&#xff…

学习系列一:YOLO系列目标检测框架之间介绍及对比

YOLO系列目标检测框架之间介绍及对比 华为HCIP AI高级工程师证书&#xff0c; 华为HCIA AI证书&#xff0c;目前从事视觉算法工作 文章目录 YOLO系列目标检测框架之间介绍及对比前言一、YOLOv1二、YOLOv2三、YOLOv3四、YOLOv4五、YOLOv5及后续算法 前言 YOLO系列算法 YOLO 创…

树与二叉树学习笔记

树与二叉树 计算机中的树树的概念树的类型 什么是二叉树二叉树&#xff1a;定义与特点二叉树&#xff1a;前序、中序、后序遍历二叉树&#xff1a;深度、广度优先遍历二叉树&#xff1a;线索化二叉树&#xff1a;序列化与反序列化 haffman树平均编码长度构建haffman树haffman树…

数学建模算法汇总(全网最全,含matlab案例代码)

数学建模常用的算法分类 全国大学生数学建模竞赛中&#xff0c;常见的算法模型有以下30种&#xff1a; 最小二乘法数值分析方法图论算法线性规划整数规划动态规划贪心算法分支定界法蒙特卡洛方法随机游走算法遗传算法粒子群算法神经网络算法人工智能算法模糊数学时间序列分析马…

大模型应用—大模型赋能网络爬虫

大模型赋能网络爬虫 简单来说,网页抓取就是从网站抓取数据和内容,然后将这些数据保存为XML、Excel或SQL格式。除了用于生成潜在客户、监控竞争对手和市场研究外,网页抓取工具还可以用于自动化你的数据收集过程。 借助AI网页抓取工具,可以解决手动或纯基于代码的抓取工具的…

shell脚本语言的入门

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

pytorch深度学习框架基本介绍

目录 1. PyTorch简介1.1 什么是PyTorch1.2 PyTorch的特点 2. 安装与配置2.1 安装PyTorch2.2 配置CUDA环境 3. 基础概念3.1 张量(Tensor)3.1.1 创建张量3.1.2 张量的类型转换 3.2 自动微分(Autograd) 4. 构建神经网络4.1 定义网络结构4.2 使用nn.Module 5. 数据加载与处理5.1 使…

腾讯技术创作特训营 -- SUPERWINNIE -- AI重塑社交内容

目录 1 什么是AI社交内容 2 案例拆解 3 用LLM做爆文选题 4 用LLM出爆文脚本提示词 1 什么是AI社交内容 任何一个因素被AI取代都是AI社交内容 2 案例拆解 数字人 资讯素材 录屏产品的素材&#xff08;小红书测试AI产品&#xff09; 脚本 素材 剪辑 3 用LLM做爆文选题 &…

帝国神话怎么样使用服务器开服(Myth Of Empires)

1、购买后登录服务器&#xff08;百度莱卡云&#xff09; 进入控制面板后会出现正在安装的界面&#xff0c;安装大约5分钟&#xff08;如长时间处于安装中请联系我们的客服人员&#xff09; 2、创建端口 一共需要用到三个端口&#xff08;游戏端口&#xff0c;查询端口&#x…

【刷题汇总 -- 压缩字符串(一)、chika和蜜柑、 01背包】

C日常刷题积累 今日刷题汇总 - day0181、压缩字符串(一)1.1、题目1.2、思路1.3、程序实现 2、chika和蜜柑2.1、题目2.2、思路2.3、程序实现 3、 01背包3.1、题目3.2、思路3.3、程序实现 -- dp 4、题目链接 今日刷题汇总 - day018 1、压缩字符串(一) 1.1、题目 1.2、思路 读完…

vue3 vue页面根目录增加注释 keep-alive 不生效 需避开此位置

已参考官方文档如下&#xff0c;进行配置 Built-in Components | Vue.js 对应页面中配置 name defineOptions({name: "Users",inheritAttrs: false, }); 从Vue Devtools可以看到组件名字变成了Users&#xff0c;如下&#xff1a; 已配置一致后&#xff0c;仍不生…

JavaRegexImprove练习(1) (2024.7.22)

ImproveExercise1 package RegexImprove20240722; import java.util.Scanner; public class ImproveExercise {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("请输入一个字符串");String str sc.nextLine();//…

【Linux】进程信号 --- 信号保存

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

【医学影像】RK3588+FPGA:满足远程诊疗系统8K音视频编解码及高效传输需求

医学影像 提供基于Intel平台、NXP平台、Rockchip平台的核心板、Mini-ITX主板、PICO-ITX主板以及工业整机等计算机硬件。产品板载内存&#xff0c;集成超高清编码/解码视频引擎&#xff0c;具有出色的数据处理能力和图形处理能力&#xff0c;功能高集成&#xff0c;可应用于超声…