繁体   English   中英

在csv中找到互惠对

[英]Find reciprocal pair in csv

我有一个大型csv文件(~250M行)具有以下结构

ID1, ID2, value
A, B, 5
B,C, 8
C,B, 4

我想得到一个表,告诉我该对(ID1,ID2)是否在文件中被回复。 所以输出应该是这样的:

ID1, ID2, Reciprocity
A,B,0
B,C,1
C,B,1

我会通过创建一个字典并检查密钥ID2 + ID1是否在字典中,但字典变得比我的RAM大。 我尝试过使用networkx但是无法创建图表,因为我的RAM也用完了。

什么是不需要将整个文件加载到RAM中的选项,但在循环中从硬盘驱动器读取时也不会过长?

可能最好和最具可扩展性的解决方案是将CSV导入SQLite数据库 然后为“Reciprocity”创建一个新表,并从那里找到遵循此近似伪代码的所有潜在对:

Load CSV into a database with Table DATA
Create RECIPROCITY Table with columns ID1,ID2,Reciprocal
Iterate through each row R in DATA:
    Let A,B = DATA.ID1, DATA.ID2
    Search RECIPROCITY for A,B
      If A,B doesnt exist add a new row
    Search RECIPROCITY for B,A
      If B,A exists update add update RECIPROCITY.Reciprocal for A,B and B,A

您使用的是UNIX-ish操作系统吗? 这是一种列出“互惠对”的方法:

$ cat data.txt
A,B, 5
B,C, 8
C,B, 4
$ cat data.txt |awk -F',' '{ if ($1<$2) print $1" "$2; else print $2" "$1}' | sort |uniq -c | awk '$1>1 {print $2" "$3}'
B C

尝试使用搁置

import shelve

pairs = shelve.open('myshelf')

with open('data', 'r') as f:
    for line in f:
        id1, id2, value = [s.strip() for s in line.split(',')]
        pairs[id1 + id2] = True

with open('processed', 'w') as f:
    for (id1, id2) in pairs:
        if id2 + id1 in pairs:
            f.write('%s, %s, 1\n' % (id1, id2))
        else:
            f.write('%s, %s, 0\n' % (id1, id2))

pairs.close()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM