如何通过python在csv文件中添加反向重复列的值

时间:2015-04-17 17:36:41

标签: python parsing csv

我是Python的新手,我的数据存在问题。我有一个有3列的csv文件。第一列和第二列是国家ISO代码,第三列是这些国家之间的贸易价值。 例如:

col1  col2 col3
USA  FRA  1500*
USA  AUS  2000
FRA  GBR  1700  
FRA  USA  2000*
AUS  FRA  3000
GBR  DEU  4000

正如您所看到的,数据包含USA FRAFRA USA的不同交易值,但我想摆脱这些行并且只有USA FRA,而且值将是它们的2个值的平均值((1500+2000)/2) 意思是: 最后,我想将结果保存到csv文件中,只有一对交易链接重复一次,并且该值是第一个csv文件中值的平均值。像这样的东西:

col1 col2 col3
USA  FRA  1750
USA  AUS  2000
FRA  GBR  1700
AUS  FRA  3000
GBR  DEU  4000

由于

2 个答案:

答案 0 :(得分:2)

这是让你入门的东西。我将为您保留输入解析。

from collections import defaultdict
dd = defaultdict(lambda: [])  # default an array for the dictionary value

input = [  # TODO: populate input from csv
    [ 'USA', 'FRA', 1500 ],
    [ 'FRA', 'USA', 2000 ]
]

def make_key(v1, v2):  # sort the countries to find the keys
    return ''.join(sorted((v1, v2)))

for row in input:
    key = make_key(row[0], row[1])
    dd[key].append(row[2])  # append the value to the array


for k, v in dd.iteritems(): # TODO: write results to file
    print(k, sum(v) / 2)  # print average

答案 1 :(得分:0)

我必须运行,所以我无法对我的代码发表评论(希望其他人可以编辑其中),但这应该让你开始:

import csv

with open('input.csv') as infile:
    trades = {}
    for src, dest, val in csv.reader(infile, delimiter=' '):
        val = float(val)
        if dest in trades and src in trades[dest]:
            trades[dest][src].append(val)
            continue
        if src not in trades:
            if dest in trades:
                src, dest = dest, src
            else:
                trades[src] = {}
        if dest not in trades[src]:
            trades[src][dest] = []
        trades[src][dest].append(val)

with open('output.csv', 'w') as outfile:
    writer = csv.writer(outfile, delimiter=' ')
    for src, d in trades.items():
        for dest, vals in d.items():
            writer.writerow([src, dest, sum(vals)/len(vals)])

这有效:

<强> input.csv

USA FRA 1500
USA AUS 2000
FRA GBR 1700
FRA USA 2000
AUS FRA 3000
GBR DEU 4000

<强> output.csv

USA AUS 2000.0
USA FRA 1750.0
GBR DEU 4000.0
FRA GBR 1700.0
FRA AUS 3000.0