【发布时间】:2016-12-02 07:12:51
【问题描述】:
我已经解决这个问题几天并尝试了几种不同的方法,但我似乎无法完全正确。这是我的 csv 数据文件的简化版本:testme.csv
"Name", "City", "State", "1996-04", "1996-05", "1996-06", "1996-07"
"Bob", "Portland", "OR", 100000, 120000, 140000, 160000
"Sally", "Eugene", "OR", 50000, 75000, 80000, 90000
"Peter", "San Francisco", "CA", , , 440000, 500000
我想将数字提取为二维数组,我希望对其进行一些数学运算。但是,在我需要忽略之前,我已经有了这些文本字段。此外,有些行不会有所有列的数字,但是一旦数字开始,它们就会向右连续(即,有些行的前几列有空项目),并且每行可能不同。此外,真实数据集有数百行数十列
这是我尝试过的一些:
import csv
import numpy as np
filename = "testme.csv"
ifile = open(filename, 'r')
header1 = ifile.readline()
reader = csv.reader(ifile)
A = np.array([]).reshape(0, 4)
for row in reader:
print row
print row[3:]
A = np.vstack([A, row[3:]])
print A
然后我得到了这个:
['Bob', ' "Portland"', ' "OR"', ' 100000', ' 120000', ' 140000', ' 160000']
[' 100000', ' 120000', ' 140000', ' 160000']
['Sally', ' "Eugene"', ' "OR"', ' 50000', ' 75000', ' 80000', ' 90000']
[' 50000', ' 75000', ' 80000', ' 90000']
['Peter', ' "San Francisco"', ' "CA"', ' ', ' ', ' 440000', ' 500000']
[' ', ' ', ' 440000', ' 500000']
[[' 100000' ' 120000' ' 140000' ' 160000']
[' 50000' ' 75000' ' 80000' ' 90000']
[' ' ' ' ' 440000' ' 500000']]
我很接近,但元素现在都是文字字符串。有没有更简单的方法可以做到这一点并获取数字,或者我知道通过这个并将每个元素转换为数字?以及我可以从将它们限制为零中受益的空元素。
提前感谢您的建议和帮助!
亚伦
更新 (8/1/16) 我确实使用了 genfromtxt 方法,因为它与我非常需要的东西相匹配。这是后代和其他人的结果
import csv
import numpy as np
NumIgnoreFirstCols = 3
filename = "testme2.csv"
ifile = open(filename, 'r')
reader = csv.reader(ifile)
header1 = next(reader)
numcols = len(header1)
#Find number of cols for usecol in genfromtxt
print("numcols", numcols)
ifile.close()
print(range(NumIgnoreFirstCols, numcols))
aMatrix = np.genfromtxt(filename, skip_header=1, delimiter=',', usecols=range(NumIgnoreFirstCols,numcols), dtype=int)
print aMatrix
normalizedMatrix = np.where(aMatrix<0, 0, aMatrix)
print(normalizedMatrix)
minValue = np.amin(normalizedMatrix)
maxValue = np.amax(normalizedMatrix)
print (minValue, maxValue)
再次感谢大家的帮助
【问题讨论】: