2

Я имею дело с простым CSV-файлом, который содержит три столбца и три строки, содержащие числовые данные. Файл CSV данных выглядит следующим образом:Как правильно использовать арифметические операторы Внутри понимания?

Col1,Col2,Col3 
1,2,3 
2,2,3 
3,2,3 
4,2,3 

У меня трудно понять, как дать мой питон программа вычитает среднее значение первого столбца «COL1» от каждого значения в том же столбце. Для иллюстрации вывод должен дать следующие значения «Col1»:

1 - 2.5 = -1.5 
2 - 2.5 = -0.5 
3 - 2.5 = 0.5 
4 - 2.5 = 1.5 

Вот моя попытка, что дает мне (TypeError: неподдерживаемый тип операнда (ов) для -: «ул» и «поплавком» ) в последний оператор печати, содержащий понимание.

import csv 

# Opening the csv file 
file1 = csv.DictReader(open('columns.csv')) 
file2 = csv.DictReader(open('columns.csv')) 

# Do some calculations 
NumOfSamples = open('columns.csv').read().count('\n') 
SumData = sum(float(row['Col1']) for row in file1) 
Aver = SumData/(NumOfSamples - 1) # compute the average of the data in 'Col1' 


# Subtracting the average from each value in 'Col1' 
data = [] 
for row in file2: 
    data.append(row['Col1']) 

# Print the results 
print Aver 
print [e-Aver for e in data] # trying to use comprehension to subtract the average from each value in the list 'data' 

Я не знаю, как решить эту проблему! Любая идея, как заставить понимание работать, чтобы дать то, что должно делать?

+2

Ошибка говорит, что вы не можете сделать строку минус поплавок. Проблемная линия имеет «e-Aver». Поэтому 'e' является строкой, а' Aver' является float. Таким образом, вам нужно преобразовать 'e' в float. – TigerhawkT3

ответ

2

Проблема в коде является то, что в случае data списка (file2), вы читаете строки из файла и сохранение строки в списке в data.

Следовательно, когда позже вы пытаетесь сделать это - [e-Aver for e in data] - он ошибается, поскольку вы пытаетесь вычесть float из строки.

Вы должны преобразовать в float или int, прежде чем хранить в списке data. Пример -

data = [] 
for row in file2: 
    data.append(float(row['Col1'])) 
+0

Спасибо, я последовал вашей инструкции, и это имеет смысл. Я все еще получаю сообщение об ошибке при преобразовании данных в тип float. Он говорит: 'ValueError: не удалось преобразовать строку в float:' Есть ли способ преодолеть эту ошибку? – MEhsan

+0

Это означает, что у вас есть строка, которая не имеет 'float' в' Col1'. –

+0

Вы получаете эту ошибку из строки 'SumData'? –

2

Вы не преобразование значения Col1 из строки к float(). Вы можете выполнить преобразование либо при чтении (как показано ниже), либо в понимании списка.

data = [] 
for row in file2: 
    data.append(float(row['Col1'])) 

# Print the results 
print Aver 
print [e - Aver for e in data]