Панды: чтение CSV с dtypes, но столбцы смешанного типа (значения NA) - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь уменьшить столбцы csv в процессе чтения, потому что выполнение этого после чтения файла занимает слишком много времени.Все идет нормально.Проблема возникает, конечно, если один столбец имеет значения NA.Есть ли возможность проигнорировать это или отфильтровать тех, кто находится в процессе чтения, может быть, с этим входом преобразователя pandas read csv?И что делает аргумент «многословный»?Документация кое-что говорит об Укажите количество значений NA, помещенных в нечисловые столбцы.

Мой подход к даункастингу до сих пор заключается в чтении первых двух строк и угадывании типа d.Я создаю отображение соответствия для аргумента dtype при чтении всего CSV.Конечно, значения NaN могут появиться в строках позже.Так вот, где могут встречаться смешанные типы:

import pandas as pd

df = pd.read_csv(filePath, delimiter=delimiter, nrows=2, low_memory=True, memory_map=True,engine='c')

if downcast == True:
    mapdtypes = {'int64': 'int8', 'float64': 'float32'}
    dtypes = list(df.dtypes.apply(str).replace(mapdtypes))
    dtype = {key: value for (key, value) in enumerate(dtypes)}
    df = pd.read_csv(filePath, delimiter=delimiter, memory_map=True,engine='c', low_memory=True, dtype=dtype)

1 Ответ

0 голосов
/ 27 февраля 2019

Не уверен, правильно ли я понял ваш вопрос, но вы, вероятно, ищете аргумент na_values, в котором вы можете указать одну или несколько строк, которые будут распознаваться как значения NaN.

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

import csv

# get only the column headers from the csv:
with open(filePath, 'r') as infile:
    reader = csv.DictReader(infile)
    fieldnames = reader.fieldnames

# iterate through each column to get the dtype:
dtypes = {}
for f in fieldnames:
    df = pd.read_csv(filePath, usecols=[f], nrows=1000)
    dtypes.update({f:str(df.iloc[:,0].dtypes)})
...