Pandas объявление read_csv dtype неправильно преобразовывает столбец - PullRequest
4 голосов
/ 13 апреля 2020

Когда я использую pandas для чтения файла CSV, я устанавливаю dtype, используя словарь (dict_types) для экономии памяти:

dict_types = {
    "Id": "object",
    "COD_OPE": "object",
    "NUM_OPE": "float32",
    "STR_ANA": "category",
    "COD_EXO": "category",
    "NUM_CPT": "object",
    "MTT_DEV": "float32",
    "SEN_MTT": "category",
}
columns = [
    "Id",
    "COD_OPE",
    "NUM_OPE",
    "STR_ANA",
    "COD_EXO",
    "NUM_CPT",
    "MTT_DEV",
    "SEN_MTT",
    "DTE_OPE", 
    "DTE_CPT",
    "DTE_VAL", 
    "DTE_TRT"
]
df_chunk = pd.read_csv(
    "../SIDP_Operations/SAB_OPE_02_2020/SAB_OPE_02_2020.rpt",
    sep="\t",
    dtype=dict_types,
    usecols=columns,
    error_bad_lines=False,
    chunksize=1000000,
    parse_dates=["DTE_OPE", "DTE_CPT", "DTE_VAL", "DTE_TRT"],
    infer_datetime_format=True,
)

Но, когда файл загружен, и я смотрю на df.info() и df.dtypes, он говорит мне, что тип STR_ANA равен object, в то время как я ожидаю, что это должно быть category. И "COD_EXO" "SEN_MTT" действительно типа category

Почему?

может быть, это потому, что я использую чанк? на самом деле я сделал это, чтобы прочитать фрейм данных

chunk_list=[] 
for chunk in df_chunk: 
    chunk_list.append(chunk) 
df=pd.concat(chunk_list,ignore_index=True)

1 Ответ

1 голос
/ 13 апреля 2020

Можно использовать pd.concat (), но лучше добавить ignore_index=True, чтобы избежать дублирования индексов.

df = pd.concat(df_chunk, ignore_index=True)

Вы заполнили 4 столбца для параметра parse_dates, которые не существует в columns.

Убедитесь, что имена столбцов в вашем CSV-файле совпадают с именами для dtypes и usecols, которые вы назначаете. Чтобы быть уверенным, используйте параметр header=N, чтобы убедиться, что pandas использует строку CS в качестве заголовка.

Попробуйте это:

# add 4 columns with date
columns = [
    "Id",
    "COD_OPE",
    "NUM_OPE",
    "STR_ANA",
    "COD_EXO",
    "NUM_CPT",
    "MTT_DEV",
    "SEN_MTT",
    "DTE_OPE", "DTE_CPT", "DTE_VAL", "DTE_TRT"
]
df_chunk = pd.read_csv(
    "../SIDP_Operations/SAB_OPE_02_2020/SAB_OPE_02_2020.rpt",
    sep="\t",
    header=0,
    usecols=columns,
    dtype=dict_types,
    parse_dates=["DTE_OPE", "DTE_CPT", "DTE_VAL", "DTE_TRT"],
    infer_datetime_format=True,
    chunksize=1000000,
    error_bad_lines=False,
    low_memory=False
)

Если он все еще не работает Попробуй сделать 1011 *.

...