【问题标题】:Python: How to calculate sum of floats on csvPython:如何计算 csv 上的浮点数总和
【发布时间】:2022-01-07 01:04:30
【问题描述】:

我开始学习 Python。如何计算 csv 文件中某一列的总和(浮点数)?

这是我到目前为止所做的,但我的代码没有给我“金额”(列)的总数:

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"

【问题讨论】:

  • 你能举一个你的csv数据的例子吗?
  • 使用pandas lib 可以轻松完成
  • 如果你能提供最小版本的 csv 来重现问题以及你得到的输出,那就太好了。它将帮助其他人找出原因并更好地提出解决方案。
  • 谢谢....给你....(不知道这个最小版本是否有意义)对不起,无法附上她的csv--任务是总结总数[1] 列的“金额”(100.00 + 3.27)。浮动行之间有空白行:日期、金额、供应商、不确定、谁、类别 3/11/17、100.00、"99 PLEDGCharlie S 99PLEDGES.COMAZ"、2、Bob Smith、charity 2017 年 3 月 11 日, 3.27,,"CAFE BEARYUM ORO VALLEY AZ"

标签: python csv sum


【解决方案1】:

您可以使用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 更改为要处理的列号。

【讨论】:

  • 我尝试使用 Decimal 和 float,均不成功。此外,还有一个标题行,因此“金额”列有我需要总结的浮点数,并且金额行之间有空白行。十进制: print(sum(Decimal(x[1]) for x in csv.reader(giftFile))) decimal.InvalidOperation: [] float: print(sum(float(x[1] ) for x in csv.reader(giftFile))) ValueError: could not convert string to float: 'amount'
  • 我已更新我的答案以删除标题行,并忽略列中的任何空值。
【解决方案2】:

在 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}')

【讨论】:

  • 嗨乔纳森!我尝试了您的解决方案,但它给了我这个错误:(我不知道我做错了什么) column_sum = sum(ls) TypeError: unsupported operand type(s) for +: 'int' and 'str'跨度>
  • 你好,桑德拉。很遗憾,我没有您的原始 CSV 文件。我只是在猜测您的原始数据集是什么样的。数据是否存储为字符串?我想知道是否将字符串列添加到浮点数据中。
  • 我已经编辑了我的代码以反映数据集中第一行存储为字符串的情况。另外,我使用float() 函数将数据转换为浮点数,以防万一。
  • 我已更新代码以捕获 1-index 列和除 0-index 行之外的所有行。
【解决方案3】:

你可以试试:

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
  • 使用DictReader 而不是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

【讨论】:

  • 我试过了,但它给了我这个错误:(在最后添加 - print(result))result = fsum(float(d.get('amount', 0)) for d in csv .DictReader(file)) ValueError: could not convert string to float: ''
  • @Sandra 您有一些事情没有告诉我们 :) 我已经用您的示例进行了尝试,它有效 - 查看编辑?
  • @Sandra 我做了一些调整,也许你可以试试。
猜你喜欢
  • 2019-08-08
  • 2015-12-26
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 2022-12-31
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
相关资源
最近更新 更多