out_gate,useless_column,in_gate,num_connect
a,u,b,1
a,s,b,3
b,e,a,2
b,l,c,4
c,e,a,5
c,s,b,5
c,s,b,3
c,c,a,4
d,o,c,2
d,l,c,3
d,u,a,1
d,m,b,2
上面显示的是一个给定的示例csv文件。首先,我的最终目标是将答案作为csv文件的一种形式,如下所示:
,a,b,c,d
a,0,4,0,0
b,2,0,4,0
c,9,8,0,0
d,1,2,5,0
我试图将每个数据(a,b,c,d)逐个匹配到in_gate,例如当out_gate' c' - > in_gate' b',连接数为8,'>' a'变成了9。
我想用列表(或元组,字典,集合)或集合来解决它。 defaultdict没有使用PANDAS或NUMPY,我想要一个可以应用于许多门(大约10到40)的解决方案。
我知道有一个类似的问题,它有很多帮助,但我在编译时仍有一些麻烦。最后,使用列列表和循环是否有任何方法?
((ex)list1 = [a,b,c,d],list2 = [b,b,a,c,a,b,b,a,c,c,a,b])
如果有一些无用的列与数据无关但最终目标保持不变会怎样?
感谢
答案 0 :(得分:1)
我使用计数器执行此任务。为了保持代码简单,我将从字符串中读取数据。我将让您弄清楚如何以您选择的格式将输出生成为CSV文件。
import csv
from collections import Counter
data = '''\
out_gate,in_gate,num_connect
a,b,1
a,b,3
b,a,2
b,c,4
c,a,5
c,b,5
c,b,3
c,a,4
d,c,2
d,c,3
d,a,1
d,b,2
'''.splitlines()
reader = csv.reader(data)
#skip header
next(reader)
# A Counter to accumulate the data
counts = Counter()
# Accumulate the data
for ogate, igate, num in reader:
counts[ogate, igate] += int(num)
# We could grab the keys from the data, but it's easier to hard-code them
keys = 'abcd'
# Display the accumulated data
for ogate in keys:
print(ogate, [counts[ogate, igate] for igate in keys])
<强>输出强>
a [0, 4, 0, 0]
b [2, 0, 4, 0]
c [9, 8, 0, 0]
d [1, 2, 5, 0]
答案 1 :(得分:1)
如果我正确理解您的问题,您可以尝试使用嵌套的collections.defaultdict
:
import csv
from collections import defaultdict
d = defaultdict(lambda : defaultdict(int))
with open('gates.csv') as in_file:
csv_reader = csv.reader(in_file)
next(csv_reader)
for row in csv_reader:
outs, ins, connect = row
d[outs][ins] += int(connect)
gates = sorted(d)
for outs in gates:
print(outs, [d[outs][ins] for ins in gates])
哪个输出:
a [0, 4, 0, 0]
b [2, 0, 4, 0]
c [9, 8, 0, 0]
d [1, 2, 5, 0]