#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
вместо areader
для получения суммы по имени столбца. - Используя
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 индексом.