Skip to main content
 首页 » 编程设计

python之有效地合并 Python 中的两个数据集

2025年05月04日16rubylouvre

有人认为使用 Python 合并两个数据集的最有效方法是什么?

一些背景知识 - 此代码将采用以下格式获取 100K+ 条记录:

{user: aUser, transaction: UsersTransactionNumber}, ... 

并使用以下数据

{transaction: aTransactionNumber, activationNumber: assoiciatedActivationNumber}, ... 

创造

{user: aUser, activationNumber: assoiciatedActivationNumber}, ... 

N.B 这些不是 Python 字典,只是最接近干净地描述记录格式的东西。

所以从理论上讲,我要做的就是创建一个 View ,让两个列表(或表)连接到一个公共(public)键上——起初这让我转向集合(联合等),但在我开始深入学习这些之前,他们是要走的路吗?到目前为止,我觉得这可以实现为:

  1. 创建字典列表并遍历列表,每次比较键,但是,最坏的情况可能会达到 len(inputDict)*len(outputDict) <- 不确定?

  2. 将数据作为内存中的 SQLite 表进行操作?最好不要,虽然对 Python 2.4 没有严格要求,但它会让生活更轻松。

  3. 某种基于集合的魔法?

澄清

这个脚本的全部目的是总结,实际数据集来自两个不同的来源。用户和交易编号以 CSV 的形式出现,作为测试电子邮件激活代码吞吐量的性能测试的输出。第二个数据集来自解析测试邮箱,其中包含交易 ID 和激活码。然后,该测试的输出是一个 CSV,它将被送回性能测试的第 2 阶段,使用配对的激活码激活用户帐户。

如果我对记录的注释有误导性,我深表歉意,我已经相应地更新了它们。

感谢您的回复,我将尝试两个想法:

  • 首先对列表进行排序(我不知道 这是多么昂贵)
  • 创建一个 带有交易代码的字典 作为 key 然后存储用户和 列表中的激活码作为 值(value)

性能对我来说并不是最重要的,我只是想尝试在我的 Python 编程中养成良好的习惯。

请您参考如下方法:

这是一种激进的方法。

不要。

您有两个 CSV 文件;一个(用户)显然是司机。别管这个了。 另一个——用户的交易代码——可以变成一个简单的字典。

除非绝对必要,否则不要“组合”或“加入”任何东西。当然不要“合并”或“预加入”。

编写您的应用程序只是在其他集合中进行简单的查找。

Create a list of dictionaries and iterate over the list comparing the key each time,

关闭。看起来像这样。注意:没有排序。

import csv 
with open('activations.csv','rb') as act_data: 
    rdr= csv.DictReader( act_data) 
    activations = dict( (row['user'],row) for row in rdr ) 
with open('users.csv','rb') as user_data: 
    rdr= csv.DictReader( user_data ) 
    with open( 'users_2.csv','wb') as updated_data: 
        wtr= csv.DictWriter( updated_data, ['some','list','of','columns']) 
        for user in rdr: 
             user['some_field']= activations[user['user_id_column']]['some_field'] 
             wtr.writerow( user ) 

这既快速又简单。保存字典(使用 shelve 或 pickle)。

however, worst case scenario this could run up to len(inputDict)*len(outputDict) <- Not sure?

错了。

一个列表是“驱动”列表。另一个是查找列表。您将通过遍历用户并查找适当的事务值来驱动。这是用户列表中的 O( n ) 个用户。查找是 O( 1 ) 因为字典是散列。