选择并操作.csv中的列
我有一个包含38列和1500多行的csv文件,这里面有浮点数和字符串。我想从中提取3列(x、y、z)的浮点数据来计算平均值,公式是 f=(x+y)/z
。经过研究,我成功地把这些列提取成了numpy数组,并进行了 f=(x+y)/z
的计算。现在当我尝试对f进行求和时,数组的值没有被加起来。我打印了f,看到有1500个正确的值,但没有得到它们的总和。
reader=csv.reader(open('myfile.csv' ,"rb"),delimiter=',')
reader.next()
reader.next()
x=list(reader)
data=numpy.array(x)
rows=data.shape[0]
for i in range (0,rows):
x=numpy.array(data[i,18]).astype('float')
y=numpy.array(data[i,19]).astype('float')
z=numpy.array(data[i,6]).astype('float')
f=numpy.array((x+y)/z)
average=numpy.sum(f)/rows
print average
3 个回答
0
如果你不想使用numpy,这里有一个纯Python的解决方案。
import csv
def f(x, y, z):
x = float(x)
y = float(y)
z = float(z)
return (x+y)/z
reader = csv.reader(open("derp.csv", 'r'))
rows = list(reader)
len_of_rows = len(rows)
f_values = []
for row in rows:
x = row[0]
y = row[1]
z = row[2]
f_values.append(f(x, y, z))
average = sum(f_values)/len_of_rows
print average
这是我的derp.csv文件的样子。
1,2,3
4,5,6
7,8,9
2
Numpy让你可以对整个数组进行操作,不需要一个一个地去处理它们。
reader=csv.reader(open('myfile.csv' ,"rb"),delimiter=',')
reader.next()
reader.next()
x=list(reader)
data=numpy.array(x)
rows=data.shape[0]
x=data[:,18].astype('float')
y=data[:,19].astype('float')
z=data[:,6].astype('float')
f = (x + y) / z
average = f.mean()
print average
5
如果 data
已经是一个数组了,那就不需要用 for
循环了:
x = data[:, 18].astype(float)
y = data[:, 19].astype(float)
z = data[:, 6].astype(float)
f = (x+y) / z
average = np.average(f)
你可以直接用 np.loadtxt
来读取你的文件,这样可能会更好:
data = np.loadtxt('myfile.csv', dtype=float, delimiter=',' skiprows=2,
usecols=(6, 18, 19))
或者可以直接获取 x
、y
和 z
的值:
x, y, z = np.loadtxt('myfile.csv', dtype=float, delimiter=',' skiprows=2,
usecols=(6, 18, 19), unpack=True)