Numpy: чтение csv, работа с неопределенными значениями

#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