【问题标题】:Accessing column data from a CSV file in Python在 Python 中从 CSV 文件访问列数据
【发布时间】:2013-06-15 17:32:42
【问题描述】:

我有一个包含 A、B、C、D 列和 N 行的 CSV 文件。 问题是这些列中的数据长度不同,即有些是 4.5,有些是 4.52。

我的问题分为两部分:

如何从 csv 文件访问这些列。 我已使用此代码打印 csv 文件的内容并将它们读入数组

    import csv
    with open('file.csv','rb') as f:
        reader = csv.reader(f)
        for row in reader:
            print row

打印CSV文件中的行,我替换了

    print row 

    z = row
    z.append(z)

将数据保存到数组中。

但是 z 是一维数组。并且数据是字符串类型的。当我尝试执行 np.median(z) 类型的操作时,它给了我一个错误。另外,我做不到

    z.append(float(z))

这给了我一个 TypeError。

而且,当我们从 csv 文件导入它们时,是否有截断值并将它们设置为一定的精度?!比如,如果文件有 4.3、4.56、4.299 等值,我想将最终导入的内容限制为小数点后一位。

这个 SE 问题最接近回答我的第二个问题 - Python - CSV: Large file with rows of different lengths - 但我不明白。如果你们中的任何人可以帮助我解决这个问题,我将不胜感激。

编辑 1: @Richie:这是一个样本数据集 - http://goo.gl/io8Az。它链接到谷歌文档。 并注册您的评论,这是我在我的 csv 文件上运行您的代码的结果 -

     ValueError: could not convert string to float: plate

@ Pieters : z = row, z.append(z) 创建了这个 - ['3836','55302','402','22 .945717','22 .771544','23 .081865','22 .428421','21.78294','21.78294',''1.40663689','-1.25641627','-1.25641627','1.780485','1.780485',123767464848106129' [...]]。

我应该提到我刚刚开始使用 python,我正在学习一些需要知道的东西!我正在即兴创作我在网上找到的一些代码。

编辑 2: 我听说过熊猫。我想我应该开始使用它了。

@ Khalid - 我已经运行了您的代码,并且能够检索到我想要的列。 我可以访问它而不是打印整行吗?作为一个静态数组?!

编辑 3: @richie:我第一次运行你的代码时,就出现了 -

Traceback(最近一次调用最后一次): 文件“”,第 4 行,在 ValueError: 无法将字符串转换为浮点数:plate

好吧,我意识到包含列名的第一行是原因,所以我删除了第一行,将其保存为一个新文件并在该文件上运行代码,它工作得非常好。

但是,如果我确实删除了包含列标识符的第一行,我将无法使用下面 khalid 提到的方法。与此同时,我正在看熊猫。

谢谢大家:)

编辑 4: 学习到教训了。熊猫真棒。工作完成:)...

【问题讨论】:

  • 您只能对列表使用“附加”。这是'z = row'一个列表?请您分享一些示例数据吗?
  • z = row; z.append(z) 创建一个自引用列表。那真的是你的代码吗?

标签: python csv multidimensional-array


【解决方案1】:

一些事情,取决于你想做什么。这是让列引用它们的简单方法:

import csv

with open('file.csv','r') as f:
    reader = csv.DictReader(f, delimiter=',')
    rows = list(reader)

for row in rows:
   print row['plate']

如果要将它们转换为浮点数或整数,可以使用map。但是,我怀疑您最后想进行一些计算,为此最好使用pandas

作为额外的奖励,pandas 将为您提供一个名为 DataFrame 的文件的 2D 网格表示。

【讨论】:

    【解决方案2】:

    试试这个;

    import csv
    import numpy as np
    class onefloat(float):
       def __repr__(self):
           return "%0.1f" % self
    with open('file.csv','rb') as f:
        reader = csv.reader(f)
        for row in reader:
            print map(onefloat,row) # your issue of 1 decimal point is taken care of here
            print '{:.1f}'.format(np.median(map(float,row))) # in case you want this too to be of 1 decimal point
    

    这就是使用 Pandas 的方式

    import pandas as pd
    data = pd.read_csv('richards_quasar_outliers.csv')
    print data['plate'].median()
    

    【讨论】:

    • 您遇到了此错误ValueError: could not convert string to float: plate,因为'plate' 是您的 csv 文件中的标题。有关如何在读取 csv 文件时忽略标题的更多信息,请参阅stackoverflow.com/a/11350095/1948860。现在删除标题并测试代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 2021-02-06
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多