在python中合并两个表与数百万行
发布时间:2020-12-16 23:13:18 所属栏目:Python 来源:网络整理
导读:我正在使用 python进行一些数据分析.我有两个表,第一个(称为’A’)有10万行和10列,第二个(‘B’)有7300万行和2列.它们具有1个带有公共ID的列,我想根据该列与两个表相交.特别是我想要表的内部连接. 我无法将内存中的表B作为熊猫数据帧加载,以便在熊猫上使用正
我正在使用
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. 我想知道你是否可以提出任何其他想法来解决这个问题. 提前致谢 解决方法
这是一个小的伪杂交,但我认为应该是相当快.
直接基于磁盘的合并,磁盘上的所有表.该 关键是你不是在选择本身,只是索引 通过启动/停止进入桌面,这是相当快的. 选择符合条件B(使用A的ids)的行将不会 另外如果你这么做,这是一个非常平行的问题(只是不要写 有关如何进行联接操作实际上是“内部”连接的注释,请参阅this answer. 对于您的merge_a_b操作,我想您可以使用标准的大熊猫连接 另一个选项(取决于“大”A)是否可能将A分为2部分 A = HDFStore('A.h5') B = HDFStore('B.h5') nrows_a = A.get_storer('df').nrows nrows_b = B.get_storer('df').nrows a_chunk_size = 1000000 b_chunk_size = 1000000 def 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 frame for 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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |