在Python中高效合并两个数据集

1 投票
4 回答
5999 浏览
提问于 2025-04-16 01:53

大家觉得用Python合并两个数据集最有效的方法是什么呢?

先说一下背景——这段代码会处理超过10万条记录,格式如下:

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

然后使用以下数据

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

来创建

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

注意,这些不是Python字典,只是最接近记录格式的表示方式。

所以理论上,我想做的就是创建两个列表(或表格)的视图,基于一个共同的关键字进行连接——一开始我想到的是集合(比如并集等),但在我深入学习这些之前,这真的是正确的方向吗?到目前为止,我觉得可以这样实现:

  1. 创建一个字典列表,然后遍历这个列表,每次比较关键字,不过最坏的情况是这个过程可能会运行到len(inputDict)*len(outputDict) <- 这我不太确定?

  2. 把数据当作内存中的SQLite表来处理?我更倾向于不这样做,因为虽然对Python 2.4没有严格要求,但这样会让事情简单一些。

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

澄清一下

这个脚本的主要目的是总结,实际上这两个数据集来自两个不同的来源。用户和交易号码是通过CSV格式输出的,来源于一个测试,测试的是电子邮件激活代码的处理能力。第二个数据集是通过解析测试邮箱得到的,里面包含交易ID和激活代码。这个测试的输出是一个CSV文件,之后会被送回到性能测试的第二阶段,使用配对的激活代码来激活用户账户。

如果我对记录的表示让人误解,我表示歉意,我已经相应地更新了它们。

谢谢大家的回复,我打算尝试两个想法:

  • 先对列表进行排序(我不知道这样做的开销有多大)
  • 创建一个以交易代码为键的字典,然后把用户和激活代码存储在一个列表中作为值

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

4 个回答

1

这看起来像是一个典型的用字典来存储交易编号的例子。不过你不需要创建一个固定的结构,只需建立查找用的字典,按需使用就可以了。

1

把这两个数据集按照交易号排序。这样的话,你在内存中只需要保留每个数据集中一行数据就可以了。

6

这是一个很特别的方法。

别这么做。

你有两个CSV文件;一个是用户信息,显然这个是主要的。就别动它。另一个是用户的交易代码,可以把它变成一个简单的字典。

除了在绝对必要的时候,不要“合并”或“连接”任何东西。更不要“合并”或“预先连接”。

让你的应用程序简单地在另一个集合中进行查找。

创建一个字典的列表,然后遍历这个列表,每次比较键。

差不多。它看起来是这样的。注意:不排序。

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 )

这样做既快又简单。保存这些字典(可以用 shelvepickle)。

不过,最坏的情况是,这可能会运行到 len(inputDict)*len(outputDict) <- 不确定?

错了。

一个列表是“主导”的列表。另一个是查找列表。你会通过遍历用户来查找相应的交易值。这是 O( n ),也就是用户列表的大小。查找是 O( 1 ),因为字典是哈希表。

撰写回答