我想从csv文件中读取一系列值,按唯一键排列,然后对值进行一些计算。因此,我想到了字典 - 我可以获得第一个值,但是在向同一个键附加第二个值时遇到了问题。
钥匙将是第一个入口;即三个字母,要存储的第一个值将是第2列和第3列中值的累积添加,要存储的第二个值将只是第3列的累积值。因此,基于下面的文件,我希望要阅读的字典:
文件:
AAA,12.0,2
BBB,14.0,4
AAA,15.5,1
输出:
AAA:30.5,3
BBB:16.0,4
示例代码:
import csv
with open('input.csv') as csv_input:
read_csv = csv.reader(csv_input)
values = {}
for row in read_csv:
try:
values[row[0]] += float(row[1]) + float(row[2])
except KeyError:
try:
values[row[0]] = float(row[1]) + float(row[2])
#values.setdefault([row[0]]).append((row[2]))
except ValueError:
pass
print values
我尝试过使用.append,却无法使用它。任何有关正确方向的建议或提示都将不胜感激。
答案 0 :(得分:0)
根据您的需要,当您这样做时,您不会存储列表 -
values[row[0]] = float(row[1]) + float(row[2])
您应该创建一个包含两个元素的列表,第一个元素是row[1]
和row[2]
的添加,第二个元素是row[2]
。
我还建议您在这里使用collections.defaultdict
,并提供一个函数,该函数返回从0
开始的两个元素的列表。
示例 -
import csv
from collections import defaultdict
with open('input.csv') as csv_input:
read_csv = csv.reader(csv_input)
values = defaultdict(lambda : [0,0])
for row in read_csv:
values[row[0]][0] += float(row[1]) + float(row[2])
values[row[0]][1] += float(row[2])
print values
示例/演示 -
>>> import csv
>>> from collections import defaultdict
>>>
>>> with open('a.csv') as csv_input:
... read_csv = csv.reader(csv_input)
... values = defaultdict(lambda : [0,0])
... for row in read_csv:
... values[row[0]][0] += float(row[1]) + float(row[2])
... values[row[0]][1] += float(row[2])
...
>>> print(values)
defaultdict(<function <lambda> at 0x005B3B70>, {'AAA': [30.5, 3.0], 'BBB': [18.0, 4.0]})
答案 1 :(得分:0)
这样的事情?
import csv
with open('input.csv') as csv_input:
read_csv = csv.reader(csv_input)
values = {}
for row in read_csv:
key = row[0]
a = float(row[1]) + float(row[2])
b = float(row[2])
try:
values[key][0] += a
values[key][1] += b
except KeyError:
try:
values[key] = list(range(2))
values[key][0] = a
values[key][1] = b
except ValueError:
pass
print(values) # {'AAA': [30.5, 3.0], 'BBB': [18.0, 4.0]}
答案 2 :(得分:0)
我建议使用collections.defaultdict
而不是常规词典:
from collections import defaultdict
import csv
sums = defaultdict(float)
with open('input.csv', 'rb') as input_file:
for row in csv.reader(input_file):
sums[row[0]] += sum(float(elem) for elem in row[1:])
print(sums) # -> defaultdict(<type 'float'>, {'AAA': 30.5, 'BBB': 18.0})