我有一个包含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: 学习到教训了。熊猫真棒。工作完成:))
答案 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()