在Python中从CSV文件访问列数据

时间:2013-06-19 08:52:31

标签: python csv multidimensional-array

我有一个包含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','164.40663689',' - 1.264641627','1.780485','1237674648848106129', [...]]。

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

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

@ Khalid - 我运行你的代码,我能够检索我想要的列。 而不是打印整行,我可以访问它吗?!作为静态数组?!

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

追踪(最近一次通话):   文件“”,第4行,in ValueError:无法将字符串转换为float:plate

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

但是,如果我删除第一行,其中包含列标识符,我不能使用下面的khalid提到的方法。我在看同时的熊猫。

感谢所有人:)

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

2 个答案:

答案 0 :(得分:3)

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

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网格表示。

答案 1 :(得分: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()