Python: Как вычислить сумму чисел с плавающей запятой в csv

#python #csv #sum

#python #csv #сумма

Вопрос:

Я начинаю изучать Python. Как мне вычислить сумму (с плавающей запятой) определенного столбца в файле csv?

Это то, что я делал до сих пор, но мой код не дает мне общее количество ‘amount’ (столбец):

 giftFile = open('input.v0.small.csv')
giftReader = csv.reader(giftFile)
giftData = list(giftReader)

for row in giftReader:
    if len(row)>0:
        giftData  = row['amount']

print('row 0:'   str(giftData[0]))
print("row 1's dollar value: "   str(giftData[1]))
 

Пример из csv-файла:

 date,amount,vendor,not sure,who,category
3/11/17, 100.00,"99 PLEDGCharlie S 99PLEDGES.COMAZ",2,Bob Smith,charity
3/11/17, 3.27,"CAFE BEARYUM ORO VALLEY AZ"
 

Комментарии:

1. Может ли yuo показать пример ваших csv данных?

2. Это можно легко сделать с pandas помощью библиотеки

3. Было бы неплохо, если бы вы могли предоставить минимальную версию csv для воспроизведения проблемы, а также результатов, которые вы получили. Это поможет другим определить причину и лучше предложить решение.

4. Спасибо …. вот и все …. (не знаю, будет ли иметь смысл эта минимальная версия) извините, не удалось прикрепить csv к ней — задача состоит в том, чтобы суммировать общее количество столбцов [1] «сумма» (100.00 3.27). Между строками с плавающей запятой есть пустые строки: дата, сумма, поставщик, не уверен, кто, категория 3/11/17, 100,00,»99 PLEDGCharlie S 99PLEDGES.COMAZ»,2,Боб Смит, благотворительность 3/11/17, 3,27,»КАФЕ БЕАРЮМ ОРО ВЭЛЛИ АЗ»

Ответ №1:

Вы могли бы попробовать:

 import csv
from math import fsum

with open('input.v0.small.csv', 'r') as file:
    result = fsum(
        float(d['amount']) if d['amount'].strip() else 0
        for d in csv.DictReader(file) if d['amount']
    )
 
  • Предположение: csv-файл содержит строку заголовка, а столбец, который вы хотите суммировать, называется amount .
  • Использование a DictReader вместо a reader для получения суммы по имени столбца.
  • Используя fsum вместо sum , чтобы избежать потери точности.

Результат для файла

 date,amount,vendor,not sure,who,category
3/11/17, 100.00,"99 PLEDGCharlie S 99PLEDGES.COMAZ",2,Bob Smith,charity
3/11/17, 3.27,"CAFE BEARYUM ORO VALLEY AZ"
 

является

 103.27
 

Результат для файла

 date,amount,vendor,not sure,who,category
3/11/17, 100.00,"99 PLEDGCharlie S 99PLEDGES.COMAZ",2,Bob Smith,charity


3/11/17, 3.27,"CAFE BEARYUM ORO VALLEY AZ"
 

является

 103.27
 

Комментарии:

1. Я пытался, но это дало мне такую ошибку: (добавлено — печать (результат) в конце) результат = fsum(float(d.get(‘amount’, 0)) для d в csv.DictReader(файл)) Ошибка ValueError: не удалось преобразовать строку в число с плавающей запятой: »

2. @Sandra Ты чего-то не договариваешь 🙂 Я пробовал это с вашим примером, и это работает — см. Редактирование?

3. @Sandra я внес некоторые коррективы, может быть, вы могли бы попробовать их.

Ответ №2:

Вы можете сделать это легко с sum помощью . csv.reader возвращает итерацию, дающую список для каждой строки, поэтому нам просто нужно выбрать правильный элемент столбца, преобразовать в число с плавающей запятой, а затем добавить их все. В этом примере используются Decimal «ожидаемые» результаты при суммировании чисел с плавающей запятой, но вы можете использовать float вместо этого, если хотите:

 import csv
from decimal import Decimal

col = 1

with open('input.v0.small.csv') as giftFile:
    reader = csv.reader(giftFile)
    header = next(reader)
    print(sum(Decimal(x[col]) for x in reader if x[col]))
 

Просто измените col номер столбца для обработки.

Комментарии:

1. Я пробовал использовать Decimal и float, оба были неудачными. Кроме того, есть строка заголовка, поэтому в столбце «сумма» указаны числа с плавающей запятой, которые мне нужно суммировать, а между строками суммы есть пустые строки. Десятичное число: print(sum(Decimal(x[1]) для x в csv.reader(подарочный файл))) десятичное число. Недопустимая операция: [<класс ‘десятичный. ConversionSyntax’>] float: print(sum(float(x[1]) для x в csv.reader(подарочный файл))) Ошибка ValueError: не удалось преобразовать строку в число с плавающей запятой: ‘amount’

2. Я обновил свой ответ, чтобы удалить строку заголовка, а также игнорировать любые пустые значения в столбце.

Ответ №3:

При открытии файлов в Python файлы должны быть закрыты. Чтобы не забыть закрыть, используйте диспетчер контекста. После чтения ваших данных в виде списка списков вы можете использовать понимание списка для извлечения данных из указанного столбца. Затем используйте sum встроенную функцию для выполнения окончательного суммирования.

 from csv import reader

# context manager for reading-in CSV file 
with open('input.v0.small.csv', 'r') as read_obj:
    csv_reader = reader(read_obj)
    data = list(csv_reader)

# list comprehension to extract specified column
ls = [float(row[1]) for row in data[1:]] 

# built-in sum function
column_sum = sum(ls)

# print result
print(f'Column sum is {column_sum}')
 

Комментарии:

1. Привет, Джонатан! Я попробовал ваше решение, но оно выдало мне эту ошибку: (я не знаю, что я делаю неправильно) column_sum = sum(ls) TypeError: неподдерживаемые типы операндов для : ‘int’ и ‘str’

2. Привет, Сандра. К сожалению, у меня нет вашего исходного файла CSV. Я только предполагаю, как выглядит ваш исходный набор данных. Хранятся ли данные в виде строки? Мне интересно, добавляю ли я столбец string к данным с плавающей запятой.

3. Я отредактировал свой код, чтобы отразить ситуацию, когда первая строка в вашем наборе данных хранится в виде строки. Кроме того, я использовал float() функцию для преобразования данных в float, на всякий случай.

4. Я обновил код, чтобы захватить столбец с 1 индексом и все строки, кроме строки с 0 индексом.