Конвертировать CSV-файл в словарь Python, массив и двоичный файл - PullRequest
1 голос
/ 20 марта 2019

У меня есть CSV-файл данных, разделенных табуляцией, с заголовками и данными разных типов, которые я хотел бы преобразовать в словарь векторов. В конце концов я хотел бы преобразовать словарь в массивы и хранить их в каком-то двоичном формате для быстрого поиска различными сценариями. Это большой файл с примерно 700 тыс. Записей и 16 столбцами. Ниже приведен пример:

"answer_option" "value" "fcast_date"    "expertise"
"a" 0.8 "2013-07-08"    3
"b" 0.2 "2013-07-08"    3

Я начал реализовывать это с помощью класса DictReader, о котором я только что узнал.

import csv
with open( "filename.tab", 'r') as records:
    reader = csv.DictReader( records, dialect='excel-tab' )
    row = list( reader )
    n = len( row )
    d = {}
    keys = list( row[0] )
    for key in keys :
        a = []
        for i in range(n):
            a.append( row[i][key] )
        d [key] = a

что дает результат

{'answer_option': ['a', 'b'],
'value': ['0.8', '0.2'],
'fcast_date': ['2013-07-08', '2013-07-08'],
'expertise': ['3', '3']}

Помимо небольшого неудобства необходимости очищать от числовых значений символы кавычек, которые их заключают, я подумал, что, возможно, есть что-то готовое. Мне также интересно, есть ли что-нибудь, что извлекает непосредственно из файла в пустые векторы, так как мне не нужно обязательно преобразовывать мои данные в словарях.

Я посмотрел на SciPy.org, и поиск CSV также ссылается на HDF5 и genfromtxt , но я еще не углублялся в эти предложения. В идеале я хотел бы иметь возможность хранить данные в формате быстрой загрузки, чтобы было просто загрузить из других сценариев только одну команду, где все векторы доступны так же, как это возможно в Matlab. / октава. Предложения приветствуются


РЕДАКТИРОВАТЬ: данные табуляции разделены строками, заключенными в кавычки.

1 Ответ

2 голосов
/ 20 марта 2019

Это прочитает CSV во фрейм данных Pandas и удалит кавычки:

import pandas as pd
import csv
import io

with open('data_with_quotes.csv') as f_input:
    data = [next(csv.reader(io.StringIO(line.replace('"', '')))) for line in f_input]

df = pd.DataFrame(data[1:], columns=data[0])
print(df)
  answer_option value  fcast_date expertise
0              a   0.8  2013-07-08         3
1              b   0.2  2013-07-08         3

Вы можете легко преобразовать данные в массив с использованием df.values:

array([['a', '0.8', '2013-07-08', '3'],
       ['b', '0.2', '2013-07-08', '3']], dtype=object)

Чтобы сохранить данные в двоичном формате, я рекомендую использовать Hdf5:

import h5py

with h5py.File('file.hdf5', 'w') as f:
    dset = f.create_dataset('default', data=df)

Чтобы загрузить данные, используйте следующее:

with h5py.File('file.hdf5', 'r') as f:
   data = f['default']

Вы также можете использовать Pandas для сохранения и загрузки данных в двоичном формате:

# Save the data
df.to_hdf('data.h5', key='df', mode='w')

# Load the data
df = pd.read_hdf('data.h5', 'df')
...