Установить тип данных для определенного столбца при использовании read_csv из панд - PullRequest
0 голосов
/ 01 июня 2018

У меня есть большой CSV-файл (~ 10 ГБ), около 4000 столбцов.Я знаю, что большинство данных, которые я ожидаю, это int8, поэтому я установил:

pandas.read_csv('file.dat', sep=',', engine='c', header=None, 
                na_filter=False, dtype=np.int8, low_memory=False)

Дело в том, что последний столбец (4000-я позиция) - это int32, могу ли я сказать read_csv, что по умолчанию использует int8и в столбце 4000 используйте int 32?

Спасибо

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Если вы уверены в числе, вы можете воссоздать словарь следующим образом:

dtype = dict(zip(range(4000),['int8' for _ in range(3999)] + ['int32']))

Учитывая, что это работает:

import pandas as pd
import numpy as np
​
data = '''\
1,2,3
4,5,6'''
​
fileobj = pd.compat.StringIO(data)
df = pd.read_csv(fileobj, dtype={0:'int8',1:'int8',2:'int32'}, header=None)
​
print(df.dtypes)

Возвращает:

0     int8
1     int8
2    int32
dtype: object

Из документов:

dtype: введите имя или имя столбца -> тип, по умолчанию нет

Тип данных для данных или столбцов.Например, {'a': np.float64, 'b': np.int32} Используйте str или object для сохранения, а не для интерпретации dtype.Если указаны конвертеры, они будут применены ВМЕСТО преобразования dtype.

0 голосов
/ 01 июня 2018

Поскольку у вас нет заголовка, имена столбцов представляют собой целочисленный порядок их появления, т. Е. Первый столбец - df[0].Чтобы программно установить последний столбец равным int32, вы можете прочитать первую строку файла, чтобы получить ширину кадра данных, а затем создать словарь целочисленных типов, которые вы хотите использовать, с количеством столбцов в качестве ключей..

import numpy as np
import pandas as pd

with open('file.dat') as fp:
    width = len(fp.readline().strip().split(','))
    dtypes = {i: np.int8 for i in range(width)}
    # update the last column's dtype
    dtypes[width-1] = np.int32

    # reset the read position of the file pointer
    fp.seek(0)
    df = pd.read_csv(fp, sep=',', engine='c', header=None, 
                     na_filter=False, dtype=dtypes, low_memory=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...