如何解决从 3 个大型 tsv/csv 文件中提取和组合数据
file1 : id,f1,f2,name,f3
file2 : id,f4,blah1,f5
file3 : id,f5,f6,blah2
result: id,blah2
目前我不能,因为只是尝试加载 panda|vaex 中的一个文件会使进程崩溃,因为它试图读取整个文件..
怎么做..?
我将在 vaex 中使用生成的文件......我认为它仍然是 ~1G
f1 = vaex.read_csv('stuff.tsv',convert=True,sep='\t')
然后:
f1.join(f2,left_on='id',right_on='id')
解决方法
'convert' 不会将文件加载到内存中......而是分块工作
f1 = vaex.read_csv('stuff.tsv',convert=True,sep='\t')
f2 = vaex.read_csv('stuff2.tsv',sep='\t')
fx1 = f1['id','blah1']
fx2 = f2['id','blah2']
然后:
ff = fx1.join(fx2,left_on='id',right_on='id')
ff.export_hdf5('file.hdf5')
,
这样的策略可能会让您的工作更轻松。它跟踪按 merged_items
跟踪项目的 id
dict,并保存 name
、blah1
和 blah2
的值。然后,使用 csv
的 reader
,它逐行迭代每个文件,而不是一次全部迭代,以减少在任何时候使用的必要内存。最后,它再次逐行写出项目。您需要修改它以适合您的确切用例,但这应该是一个不错的开始。
merged_items = {}
with open ('file1.csv','r') as csv_file:
reader = csv.reader(csv_file)
next(reader) # skip first row
for row in reader:
row_id = row[0]
name = row[3]
merged_items[row_id] = {'name':name}
with open ('file2.csv','r') as csv_file:
reader = csv.reader(csv_file)
next(reader) # skip first row
for row in reader:
row_id = row[0]
blah1 = row[2]
merged_items[row_id]['blah1'] = blah1
with open ('file3.csv','r') as csv_file:
reader = csv.reader(csv_file)
next(reader) # skip first row
for row in reader:
row_id = row[0]
blah2 = row[3]
merged_items[row_id]['blah2'] = blah2
with open('output.csv','w',newline='') as output:
writer = csv.writer(output,delimiter='\t') # change these options as you see fit
for id,metadata in merged_items.items():
writer.writerow([id,metadata['name'],metadata['blah1'],metadata['blah2'])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。