将大型数据帧连接在一起

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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在Android中维护应用程序状态   javajavacc:如何指定在特定上下文中需要哪些令牌?   java为什么改型会在重新加载数据时设置以前的响应?   java如何将键转换为字符串,反之亦然   java JDOM解析器插入#固定手动属性   java按元素对XML数据排序?   java Android中有哪些哈希算法?   java为什么使用可选返回类型进行单元测试失败?   Gson和argonauts使用Gson将javascript数组转换为json字符串并转换为javapojo时遇到的问题。试图让我的结构正确   java中的空格   java SQLite高分,草率IndexOutofBounds Android   使用Spring OAUTH2的java Make客户端   netbeans如何在java中创建一个JPopupMenu,其中包含一个要复制文本的项