【问题标题】:Iterating over a csv.reader object and handling blank data without using pandas/dataframes迭代 csv.reader 对象并在不使用 pandas/dataframes 的情况下处理空白数据
【发布时间】:2021-02-12 11:46:30
【问题描述】:

我对迭代列表比较陌生,看过一些 youtube 视频和其他资源后,我已经能够导入一个 CSV 文件并创建一个字符串值数组。 CSV 文件有空格,所以当我循环并转换为整数时,它会失败。当我使用带有 isinstance 作为浮点数的 IF 语句来处理错误时,我的输出中返回 0。

我正在尝试在没有内置库的情况下执行此操作,以便更好地了解如何遍历列表。我觉得在这里问这样一个平凡的问题很愚蠢,任何有关如何处理错误的指导将不胜感激。

with open('WHO.CSV', 'r') as csv_file:
    csv_reader = csv.reader(csv_file)
    next(csv_reader)
    avg_100k = 0
    for row in csv_reader:
        if isinstance(row[7], float) == True:
            avg_100k = avg_100k + float(row[7])
            j = j + 1

print(j)
print(avg_100k)


javg_100k 的输出都是 0.0。为什么没有正确计算平均值?

【问题讨论】:

  • CSV 没有列类型,它们都是字符串,那么为什么 row[7] 会是浮点数?
  • 我正在尝试将其从字符串类型转换为浮点数,以便对它们求和,我不确定这是否是正确的方法?
  • isinstance 在你的类型转换之前运行,但是

标签: python list loops csv iteration


【解决方案1】:

如果您可以提供输入数据或其中的样本,那么帮助您诊断问题会容易得多。

尝试类似的方法,而不是使用isinstance(),而是查看从 CSV 中提取的数据,并直接根据该值确定它是否为空。

with open('WHO.CSV', 'r') as csv_file:
    csv_reader = csv.reader(csv_file)
    next(csv_reader)
    avg_100k = 0
    for i, row in enumerate(csv_reader):
        if row[7] != "" or row[7] != " ":
            avg_100k += float(row[7])

print(i)
print(avg_100k)

【讨论】:

  • 嗨,James,我的 CSV 文件在此处找到:who.int/tb/country/data/download/en 我仍然没有得到有效的输出,您有时间可以看一下吗?谢谢你幽默。
【解决方案2】:

如果您想检查该值是否不是空字符串,您可以这样做

if not row[7].strip():

如果你想聚合一列,你可以这样做

avg_100k = sum(float(row[7]) for row in csv_reader if not row[7].strip())

【讨论】:

    猜你喜欢
    • 2013-08-20
    • 2012-09-04
    • 2021-11-09
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2020-10-14
    相关资源
    最近更新 更多