python中csv文件的数据积累

2024-10-01 07:22:38 发布

您现在位置:Python中文网/ 问答频道 /正文


out_gate,in_gate,num_connection
a,b,1
a,b,3
b,a,2
b,c,4
c,a,5
c,b,5
c,b,3
c,a,4

上面显示的是一个示例csv文件。 首先,我的最终目标是编译结果变成一个关于门之间连接数的表,如下所示:

  a b c 
a 0 4 0 
b 2 0 4 
c 9 8 0 

现在我完成了第一列的列表(out\u gate) 像这样;listfile = ['a','b','c']并尝试将每个数据(a,b,c)一个接一个地匹配到inu门 因此,例如,当out\u gate'c'->;in\u gate'b'时,连接数为8,并且 “c”->;“a”变为9。你知道吗

我可以用它的连接号来匹配出入口和入口,但是很难累积每个出入口的连接号

有什么解决办法吗?你知道吗


Tags: 文件csv数据ingt示例列表connection
3条回答

如果您不想使用逐行读卡器和defaultdict,那么这是通过pandas.pivot_table得到的一行高级答案。你知道吗

import pandas as pd

df = pd.DataFrame([['a', 'b', 1], ['a', 'b', 3], ['b', 'a', 2], ['b', 'c', 4],
                   ['c', 'a', 5], ['c', 'b', 5], ['c', 'b', 3], ['c', 'a', 4]],
                  columns=['out_gate', 'in_gate', 'num_connection'])

pd.pivot_table(df, index='out_gate', columns='in_gate', values='num_connection', aggfunc='sum').fillna(0)

在纯Python中,您应该查看^{}模块以获取输入和^{}以获取总计:

from csv import reader
from collections import defaultdict

d = defaultdict(lambda: defaultdict(int))
with open('file.csv') as f:
    r = reader(f)
    next(r)  # skip headers
    for row in r:
        if len(row) >= 3:
            x, y, count = row
            d[x][y] += int(count)

keys = sorted(d)
for x in keys:
    print(' '.join(str(d[x][y]) for y in keys))

0 4 0
2 0 4
9 8 0

如果对大量数据执行此操作,则绝对应该检查numpy和pandas,它们都有比本地python更有效和自然的表处理方法。你知道吗

如果您现在只需要一个解决方案,那么可以在纯python中使用collections.defaultdict直接进行累加:

from collections import defaultdict

con = defaultdict(int)
for count, line in enumerate(connections):
    if count == 0:
        continue
    in_gate, out_gate, number = line.split(',')
    con[f"{in_gate}->{out_gate}"] += int(number)

现在您可以通过以下方式访问条目:

print(con['a->b'])
>> 4
print(con['a->c'])
>> 0

相关问题 更多 >