我是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 FRA
和FRA 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
由于
答案 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