将大型数据帧连接在一起
datawelder的Python项目详细描述
对类似数据帧的大文件执行类似SQL的JOINs。在
- 您的文件系统中是否有大量大于内存的数据集?在
- 你有没有想过用一种简单的方法把他们连在一起?在
- 您想在不使用数据库的情况下实现这一点吗?在
如果以上问题的答案是“是”,那么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
我们可以按如下方式连接这两个数据帧:
^{pr2}$调整
可以显式指定分区键:
$ 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
它是如何工作的?在
首先,datawelderpartitions每个数据集使用一个分区键。 我们使用了5个分区,因为数据集很小,但是在处理实际数据时,可以指定任意的分区大小。在
在本例中,它自动将文件的格式标识为CSV。 您可以通过手动指定格式和相关参数(例如字段分隔符、引用等)来帮助它。在
我们没有在上面的示例中指定要使用的分区键,因此datawelder为我们选择了一个默认值(您可以覆盖它)。 在上面的示例中,我们使用默认键(无论第一列是什么)将每个数据集拆分为10个分区,但是您可以重写它。在
特点
- 通过子进程/多处理实现多核并行化
- 通过smart_open访问云存储进行读写。您不必在本地存储任何内容。在
- 开箱即用地读/写各种文件格式(CSV、JSON、pickle)
- 用于处理文件格式边缘情况的灵活API
- 项目
标签: