Как читать CSV без первого столбца
Я пытаюсь прочитать простой CSV файл, как показано ниже, и поместить его содержимое в 2D-массив:
"","x","y","sim1","sim2","sim3","sim4","sim5","sim6","sim7","sim8","sim9","sim10","sim11","sim12"
"1",181180,333740,5.56588745117188,6.29487752914429,7.4835410118103,5.75873327255249,6.62183284759521,5.81478500366211,4.85671949386597,5.90418815612793,6.32611751556396,6.99649047851562,6.52076387405396,5.68944215774536
"2",181140,333700,6.36264753341675,6.5217604637146,6.16843748092651,5.55328798294067,7.00429201126099,6.43625402450562,6.17744159698486,6.72836923599243,6.38574266433716,6.81451606750488,6.68060827255249,6.14339065551758
"3",181180,333700,6.16541910171509,6.44704437255859,7.51744651794434,5.46270132064819,6.8890323638916,6.46842670440674,6.07698059082031,6.2140531539917,6.43774271011353,6.21923875808716,6.43355655670166,5.90692138671875
Для этого я использую это:
data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1)
Но я всегда получал это сообщение:
"ValueError: could not convert string to float: "1"
Я думал, что проблема была в первом столбце каждой строки. Итак, я попытался прочитать его без первого столбца, но я не мог узнать, как это сделать.
Итак, как я мог игнорировать первый столбец? Есть ли способ прочитать этот файл с первым столбцом?
Ответы
Ответ 1
Вы можете указать конвертер для любого столбца.
converters = {0: lambda s: float(s.strip('"')}
data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1, converters=converters)
Или вы можете указать, какие столбцы использовать, например:
data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1, usecols=range(1,15))
http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html
Один из способов пропустить первый столбец, не зная количества столбцов, - это прочитать количество столбцов из csv вручную. Это достаточно просто, хотя вам, возможно, потребуется настроить его, чтобы учесть форматирование несоответствий *.
with open("Data/sim.csv") as f:
ncols = len(f.readline().split(','))
data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1, usecols=range(1,ncols+1))
* Если в верхней части находятся пустые строки, вам нужно будет пропустить их. Если в заголовках полей могут быть запятые, вы должны подсчитать столбцы, используя вместо них первую строку данных. Итак, если у вас есть определенные проблемы, я могу добавить некоторые детали, чтобы сделать код более надежным.
Ответ 2
Вы можете использовать панд и читать его как объект DataFrame. Если вы знаете столбец, который вам не нужен, просто добавьте .drop
в строку загрузки:
a = pandas.read_csv("Data/sim.csv",sep=",")
a = a.drop(a.columns[0], axis=1)
Первая строка будет читаться как заголовок, но вы можете добавить skiprows = 1 в параметре read_csv.
Pandas DataFrames - это массивы numpy, поэтому преобразование столбцов или матриц в numy массивы довольно просто.
Ответ 3
Попытка чтения csv файла с использованием библиотеки csv
import csv
def someFunc(fname):
with open(fname) as f:
reader = csv.reader(f)
i = 0
header = True
for row in reader:
if header:
header = False
continue
out[i] = [row[j] for j in range(len(columns))]
i += 1
return out
out будет иметь 2D-массив.
Ответ 4
Ответы jmilloy и Deninhos оба хороши. Если OP специально хочет читать в массиве NumPy (в отличие от pandas dataframe), другой упрощенной альтернативой является удаление столбца индекса после его чтения. Это работает, когда вы знаете, что столбец индекса всегда первый, но число функций ( столбцы) являются гибкими.
data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1)
data = np.delete(data, 0, axis = 1)