#python #csv #numpy
#python #csv #numpy
Вопрос:
Каков наилучший способ считывания данных из файла csv в массив numpy, когда некоторые значения помечены как «неопределенные» следующим образом:
0.231620,0.00001,444.157
0.225370,--undefined--,1914.637
0.237870,0.0003,--undefined--
У меня много таких файлов, которые мне придется перебирать, и можно предположить, что неопределенное значение должно быть равно нулю.
Ответ №1:
Для чтения файлов CSV и замены значений наилучшим способом, я думаю, является использование Pandas, который также использует numpy
import pandas as pd
df = pd.read_csv('foo.csv', header=None)
df.replace("--undefined--", 0.0, inplace=True)
df
0 1 2
0 0.23162 0.00001 444.157
1 0.22537 0 1914.637
2 0.23787 0.0003 0
Ответ №2:
Нет необходимости в Pandas, просто используйте Numpy.
import numpy as np
x = np.genfromtxt('data.csv', dtype=np.float, delimiter=',',
missing_values='--undefined--', filling_values=0.0,
)
Комментарии:
1. Много хороших ответов. Я остановился на использовании Pandas Маркуса Ренно, и это отлично работает. Но этот немного лучше, если полагаться только на Numpy (и бонусные очки стиля за то, что он однострочный).
Ответ №3:
Я бы посоветовал вам попытаться преобразовать каждое прочитанное вами значение в float, затем перехватить исключение typecast ValueError и присвоить ему значение нуля в обработчике исключений.
Это будет самый питонический способ
Предполагая, что ваш CSV содержит значения с плавающей запятой, вы должны закончить чем-то вроде:
with open('data.csv', 'r') as fd:
# iterate over all lines in csv
for line in fd:
# split and iterate over values in line, maintaining item index
for i, value in enumerate(line.split(',')):
try:
value = float(value)
except ValueError:
# consider undefined/non-float value equals to 0
value = 0.0
# store parsed value wherever you need it
print('value[%d] = %f' % (i, value))
В качестве альтернативы, только из строк ‘—undefined—‘, которые будут обрабатываться как ‘0.0’, вы можете написать это как (самый внутренний цикл)
value = float(value) if value != '--undefined--' else 0