【问题标题】:How do I find the average of a column of a csv file in python?如何在 python 中找到 csv 文件的列的平均值?
【发布时间】:2015-05-11 01:20:45
【问题描述】:

我正在尝试从 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”,它们是字符串。尝试对它们进行 int 转换。

标签: python csv average


【解决方案1】:

改变这一行:

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)

注意:您希望在遍历所有行后计算整列的“平均值”。所以你想保持一个运行总数,然后在循环之外计算平均值。

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

导入 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 所建议的那样——捕捉任何错误并适当地处理它们是一个的想法。 “适当”取决于您,取决于用例:)

【讨论】:

  • 或者,您可以只保留x_sum += int(…)x_length += 1(或通过enumerate 脱离循环获得x_length)而不必构建列表。但是您的方式更容易理解,并且在 OP 的情况下不太可能成为性能问题。
  • 感谢@abarnert 相应调整:)
  • 我建议在 int 的演员表周围设置一个 try/except 块来处理意外字符。 EAFP 和所有这些:)
猜你喜欢
  • 2021-12-13
  • 2016-05-05
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多