将大型数据框连接在一起
项目描述
在大型类似文件的数据框上执行类似SQL的JOIN操作。
您的文件系统中是否堆放着大量超出内存的dataset数据集?
您是否梦想着一种简单地将它们连接在一起的方法?
您想在不需要使用数据库的情况下实现这一点吗?
如果上述问题的答案是“是”,那么datawelder就是为您准备的!
示例
首先,检查我们的玩具数据集。它包含两个独立表中的国家名称和货币。
$ head -n 5 sampledata/names.csv
iso3,name
AND,Principality of Andorra
ARE,United Arab Emirates
AFG,Islamic Republic of Afghanistan
ATG,Antigua and Barbuda
$ head -n 5 sampledata/currencies.csv
iso3,currency
AND,Euro
ARE,Dirham
AFG,Afghani
ATG,Dollar
我们可以像下面这样将这两个数据框连接起来
$ python -m datawelder.partition sampledata/names.csv partitions/names 5
$ python -m datawelder.partition sampledata/currencies.csv partitions/currencies 5
$ python -m datawelder.join out.csv partitions/names partitions/currencies --format csv
$ grep AND out.csv
AND,Principality of Andorra,AND,Euro
调整
您可以显式指定分区键
$ python -m datawelder.partition sampledata/names.csv partitions/names 5 --keyindex 0
$ python -m datawelder.partition sampledata/names.csv partitions/names 5 --keyname iso3
您可以显式指定任何格式参数(例如CSV分隔符)
$ python -m datawelder.partition sampledata/names.csv partitions/names 5 --fmtparams delimiter=',' lineterminator='\n'
同样,对于输出
$ python -m datawelder.join out.csv partitions/names partitions/currencies --format csv --fmtparams delimiter=;
$ grep AND out.csv
AND;Principality of Andorra;AND;Euro
其他格式透明工作
$ python -m datawelder.partition sampledata/names.json partitions/names 5 --keyname iso3
一旦您分区了数据集,它们原来的格式就无关紧要了。您可以轻松地将它们与任何其他分区数据集合并
$ python -m datawelder.join out.json partitions/names partitions/currencies --format json --subs 1
$ head -n 5 out.json
{"iso3": "AGO", "name": "Republic of Angola", "iso3_1": "AGO", "currency": "Kwanza"}
{"iso3": "AND", "name": "Principality of Andorra", "iso3_1": "AND", "currency": "Euro"}
{"iso3": "ARM", "name": "Republic of Armenia", "iso3_1": "ARM", "currency": "Dram"}
{"iso3": "ATF", "name": "French Southern and Antarctic Lands", "iso3_1": "ATF", "currency": "Euro"}
{"iso3": "AZE", "name": "Republic of Azerbaijan", "iso3_1": "AZE", "currency": "Manat"}
您还可以选择要保留的字段子集(类似于SQL SELECT)
$ python -m datawelder.join out.csv partitions/names partitions/currencies --format csv --select name,currency --subs 1
$ head -n 5 out.csv
name,currency
Republic of Angola,Kwanza
Principality of Andorra,Euro
Republic of Armenia,Dram
French Southern and Antarctic Lands,Euro
每个列的名称都以前面数据框的数字为前缀。例如,1.currency表示“来自数据框1的货币字段”。
您还可以根据需要重命名所选字段(类似于 SQL SELECT)。
$ python -m datawelder.join out.csv partitions/names partitions/currencies --format csv --select 'name as country_name, currency as curr' --subs 1
$ head -n 5 out.csv
country_name,curr
Republic of Angola,Kwanza
Principality of Andorra,Euro
Republic of Armenia,Dram
French Southern and Antarctic Lands,Euro
最后,您可以使用多个进程进行连接。默认情况下是 CPU 的数量。由于竞态条件,输出文件中行的顺序可能不同,但这不会影响数据的完整性。
$ python -m datawelder.join out.csv partitions/names partitions/currencies --format csv --select '0.name as name, 1.currency as curr' --subs 4
它是如何工作的?
首先,datawelder 使用分区键对每个数据集进行分区。由于数据集很小,我们使用了 5 个分区,但在处理真实数据时,您可以指定任意大小的分区。
在这种情况下,它自动识别文件的格式为 CSV。您可以通过手动指定格式和相关参数(例如字段分隔符、引号等)来提供帮助。
在上面的示例中,我们没有指定要使用的分区键,因此 datawelder 为我们选择了默认值(您可以覆盖它)。在上面的示例中,我们使用默认键(无论是什么第一列)将每个数据集分成 5 个分区,但您可以覆盖它。
功能
通过子进程/多进程实现跨多个核心的并行化
通过 smart_open 访问云存储进行读写,例如通过 S3。您无需在本地存储任何内容。
开箱即用支持读写各种文件格式(CSV、JSON、pickle)
灵活的 API 用于处理文件格式边缘情况
项目详情
datawelder-0.9.0.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 0c75b34ea7fac0e4535b54305ae921b4c4da0f2be7cf1039b3497f16e45688b4 |
|
MD5 | 59cd21cb15e488f702468dcc845cfe56 |
|
BLAKE2b-256 | a6317c2d002d0a17c9a1a68305b5f2691aed1bde32c2daf673598fa567874838 |