如何在python中找到csv文件列的平均值?

时间:2015-05-11 01:20:46

标签: python csv average

我试图在csv文件中的不同时间从APM列表中找到平均APM(每分钟操作数)。当我尝试使用此代码时:

import csv

with open('test_game.csv') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
    x = (row['Total APM'])
    x_sum = sum(x)
    x_length = len(x)
    x_average = x_sum / x_length
    print(x_average)

我收到此错误:

Traceback (most recent call last):
File "C:/Users/Luke's Laptop/Desktop/magicka_practice.py", line 7, in <module>
x_sum = sum(x)
TypeError: unsupported operand type(s) for +: 'int' and 'str'

这是否意味着我必须将csv行的输出更改为整数列表(如果是这样的话?)或者我的代码是否存在明显错误。我对此非常陌生,所以这可能是一个愚蠢的问题,或者我可能会做一些非常明显的事情。我感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

更改此行:

x = (row['Total APM'])

为:

x = int(row['Total APM'])

这会将您的字符串/数字转换为实际的整数,您可以使用。

进行数值运算

以下是代码中可能的内容:

>>> x = "1"
>>> sum(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>> y = int(x)
>>> sum(y)
1

Python是strongly typed,因此通常不能对不兼容的不同类型执行任意操作。例如:int +str会产生TypeError

你可能想要的是:

import csv

with open('test_game.csv') as csvfile:
reader = csv.DictReader(csvfile)
xs = []
for row in reader:
    try:
        x = int(row['Total APM'])
        xs.append(x)
    except ValueError:
        print("Error converting: {0:s}".format(row['Total APM']))
x_average = sum(xs) / len(xs)
print(x_average)

NB:您希望在遍历所有行后计算整列的“平均值”。因此,您希望保持运行总计,然后计算循环外的平均值。

更新:或者(更符合原始算法),您可以这样做:

导入csv

with open('test_game.csv') as csvfile:
reader = csv.DictReader(csvfile)
x_sum = x_length = 0
for row in reader:
    try:
        x = row['Total APM']
        x_sum = += int(x)
        x_length += 1
    except ValueError:
        print("Error converting: {0:s}".format(x))
x_average = x_sum / x_length
print(x_average)

这保持了一个运行总和和总长度但是* NB **除非你想计算一个运行平均值,否则你仍需要计算循环外的平均值:)

更新#2:正如@Karl所建议的那样 - 抓住任何错误并妥善处理错误是的想法。 “适当”由您决定,取决于用例:)