簡體   English   中英

使用python從csv文件中累積數據

[英]data accumulating from csv file using python


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而'c'-> 'a'變成9。

我想用列表(或元組,字典,集合)或集合來解決它。 defaultdict無需使用PANDAS或NUMPY,並且我想要一種也可以應用於許多門(大約10至40)的解決方案。

我知道有一個類似的問題,它很有幫助,但是在編譯時仍然有一些麻煩。 最后,是否可以使用列列表和for循環?

((ex)list1 = [a,b,c,d],list2 = [b,b,a,c,a,b,b,a,c,c,a,b])

如果有一些無用的列與數據無關,但最終目標保持不變怎么辦?

謝謝

我會為此使用計數器。 為了簡化代碼,我將從字符串中讀取數據。 然后,我將告訴您如何以您選擇的格式將輸出生成為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]

如果我正確理解了您的問題,則可以嘗試為此使用嵌套的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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM