在python中合并两个表与数百万行

在python中合并两个表与数百万行,第1张

概述我正在使用 python进行一些数据分析.我有两个表,第一个(称为’A’)有10万行和10列,第二个(‘B’)有7300万行和2列.它们具有1个带有公共ID的列,我想根据该列与两个表相交.特别是我想要表的内部连接. 我无法将内存中的表B作为熊猫数据帧加载,以便在熊猫上使用正常的合并功能.我尝试通过块读取表B的文件,将每个块与A相交并连接这些交点(从内部连接输出).这是可以的速度,但每一次,然后这给 我正在使用 python进行一些数据分析.我有两个表,第一个(称为’A’)有10万行和10列,第二个(‘B’)有7300万行和2列.它们具有1个带有公共ID的列,我想根据该列与两个表相交.特别是我想要表的内部连接.
我无法将内存中的表B作为熊猫数据帧加载,以便在熊猫上使用正常的合并功能.我尝试通过块读取表B的文件,将每个块与A相交并连接这些交点(从内部连接输出).这是可以的速度,但每一次,然后这给我的问题,吐出一个细分错误…没有那么好.这个错误很难复制,但它发生在两台不同的机器上(Mac OS SNow Leopard和UNIX,RedHat).我最后尝试使用Pandas和Pytables的组合,将表B写入磁盘,然后迭代表A,并从表B中选择匹配的行.最后一个选项有效,但速度很慢.默认情况下已经编制了Pytables表B.
我想知道你是否可以提出任何其他想法来解决这个问题.
提前致谢解决方法 这是一个小的伪杂交,但我认为应该是相当快.
直接基于磁盘的合并,磁盘上的所有表.该
关键是你不是在选择本身,只是索引
通过启动/停止进入桌面,这是相当快的. @H_419_12@选择符合条件B(使用A的IDs)的行将不会
非常快,因为我认为它可能会将数据导入python空间
而不是内核搜索(我不确定,但你可能想要的
在内核优化部分更多地投入pytables.org上,
有一种方法来判断它是否在内核中)

@H_419_12@另外如果你这么做,这是一个非常平行的问题(只是不要写
结果来自多个进程的同一个文件,pytables不是写安全的
为了那个原因)

@H_419_12@有关如何进行联接 *** 作实际上是“内部”连接的注释,请参阅this answer.

@H_419_12@对于您的merge_a_b *** 作,我想您可以使用标准的大熊猫连接
这是非常有效的(当内存中)

@H_419_12@另一个选项(取决于“大”A)是否可能将A分为2部分
(索引相同),在第一个中使用较小的(可能使用单列)
表;而不是存储合并结果本身,存储行索引;后来
你可以拉出你需要的数据(就像使用索引器一样)
见http://pandas.pydata.org/pandas-docs/stable/io.html#multiple-table-queries

A = hdfstore('A.h5')B = hdfstore('B.h5')nrows_a = A.get_storer('df').nrowsnrows_b = B.get_storer('df').nrowsa_chunk_size = 1000000b_chunk_size = 1000000def merge_a_b(a,b):    # function that returns an operation on passed    # frames a and b    # Could be a merge,join,concat,or other operation that     # results in a single framefor a in xrange(int(nrows_a / a_chunk_size) + 1):    a_start_i = a * a_chunk_size    a_stop_i  = min((a + 1) * a_chunk_size,nrows_a)    a = A.select('df',start = a_start_i,stop = a_stop_i)    for b in xrange(int(nrows_b / b_chunk_size) + 1):        b_start_i = b * b_chunk_size        b_stop_i = min((b + 1) * b_chunk_size,nrows_b)        b = B.select('df',start = b_start_i,stop = b_stop_i)        # this is your result store        m = merge_a_b(a,b)        if len(m):            store.append('df_result',m)
总结

以上是内存溢出为你收集整理的在python中合并两个表与数百万行全部内容,希望文章能够帮你解决在python中合并两个表与数百万行所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1206865.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存