read_csv загружает большие поля CSV-файла как объекты - PullRequest
0 голосов
/ 28 декабря 2018

почему read_csv автоматически преобразует все мои прочитанные столбцы в типы объектов?Я хочу прочитать 10 Gb csv (float и Int) и загрузить его в кадр данных pandas.Я не сталкиваюсь с этой проблемой (где все столбцы с числами преобразуются в типы объектов), если я читаю меньший файл (100 МБ или меньше) с помощью panda или dask

csv sample

Я пытался указать dtype явно, вручную как часть read_csv;все еще заканчивались объектами (проверено после чтения с помощью df.dtype)

import pandas as pd
file='D:/path/combine.csv'
data_type={'Lat':np.float32,'Long':np.float32,   'HorizontalAccuracy':np.int,'RSRP':np.int}
data=pd.read_csv(file, low_memory=False, dtype=data_type)
data.dtypes

пытался прочитать 1-ю строку файла и автоматически получить dtypes, затем прочитать файл с определенными dtypes: в итоге все объекты

file='D:/path/combine.csv'
col_names=pd.read_csv(file, nrows=0).columns
types_dict=data_type
types_dict.update({col:np.int64 for col in col_names if col not in types_dict})
data=pd.read_csv(file, low_memory=False, dtype=data_type)
data.dtypes

TypeError: Невозможно привести массив из dtype ('O') к dtype ('float32') в соответствии с правилом safe. Во время обработки вышеупомянутого исключения произошло другое исключение: ValueError: не удалось преобразовать строкуto float: '\ x1a'

пробовал read_csv с dask при явном указании dtype;получена ошибка о том, что невозможно преобразовать строку в число с плавающей точкой

import dask.dataframe as dd
file='D:/path/combine.csv'
data_type={'Lat':np.float32,'Long':np.float32, 'HorizontalAccuracy':np.int,'RSRP':np.int} 
ddf=dd.read_csv(file, dtype=data_type)
ddf.compute()

TypeError: невозможно преобразовать массив из dtype ('O') в dtype ('float32') согласно правилу 'safe' ValueError: не удалось преобразоватьстрока для плавания: 'Широта'

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Моя проблема с таймаутами и чтением всего большого csv как объекта, несмотря на то, что это числа, была вызвана отсутствием указания "header = 0".Что еще более важно, где заголовок = 0 помещен в ваш read_csv, будет определять, будет ли он работать.

неверный код dd.read_csv (файл, usecols = twr_coln, dtype = data_type, header = 0) правильный код dd.read_csv (файл, header = 0, usecols = twr_coln, dtype = data_type)

0 голосов
/ 29 декабря 2018

Есть некоторые проблемы с вашим кодом, и, в частности, ваши имена столбцов в вашем CSV-файле отличаются от имен назначаемых вами dtypes.Это выдаст ошибку, потому что они должны точно соответствовать.Поэтому, используя это в качестве входного файла (я пытался воспроизвести ваш как можно больше):

Location_Lat,Location_Long,Location_H,Location_Z,QOS_RSRP
47.46058,-123.053,6,98588,-115
47.62989,-122.81,87,98312,-114
47.54865,-122.859,9,98312,-113

Я заметил, что у вас есть один дополнительный столбец (Location_Z), который вы не вызывали в своих dtypes.Я установил фрейм данных для назначения dtypes и использования указанных столбцов на основе вашей информации выше.Вы можете указать все, что вы хотите в функции pd.read_csv(), следующим образом:

import sys

import pandas как pd import numpy as np

df = pd.read_csv('fun.csv', header=0, usecols=['Location_Lat',
                                               'Location_Long',
                                               'Location_H',
                                               'QOS_RSRP'],
                 dtype={'Location_Lat':np.float32,
                        'Location_Long':np.float32,
                        'Location_H':np.int,
                        'QOS_RSRP':np.int}, low_memory=False)
print(df)
print(df.dtypes)

Несколько вещей, на которые стоит обратить внимание.Я явно назначил header=0.Это гарантирует, что pandas использует первую строку csv в качестве заголовка (поэтому я знаю, как будут называться имена).Если вы хотите, чтобы это была другая строка, просто установите header=(line you want)

Во-вторых, я сказал pandas явно использовать только 4 из 5 столбцов, так как вы не указали dtype для столбца Location_Z, яне включал этот столбец, но если вы хотите его, вы можете просто включить его в параметр usecols= выше и указать тип dtype в параметре dtype=.

Наконец, dtype dict использует имена столбцов из фрейма данных для назначения dtypes.К счастью, мы присвоили столбцам header=0, так что pandas уже «знает» имена столбцов.В пандах плавающие и целые числа имеют действительно низкую стоимость памяти по сравнению со строковым объектом.Причина, по которой ваш df возвращает dtypes объекта для всего, состоит в том, что заголовок может быть прочитан как row1 вашего df, и в этом случае pandas назначит весь столбец как dtypes объекта.Результат вышеприведенного кода при выводе на экран выглядит следующим образом:

[dkennetz@hpc02  fun_temp]$ python3.5 pandas_fun.py
   Location_Lat  Location_Long  Location_H  QOS_RSRP
0     47.460579    -123.053001           6      -115
1     47.629890    -122.809998          87      -114
2     47.548649    -122.859001           9      -113
Location_Lat     float32
Location_Long    float32
Location_H         int64
QOS_RSRP           int64
dtype: object

Итак, мы видим, что только 4 из 5 столбцов загружаются в фрейм данных, и что dtypes действительно являются float32 и int64 какназначены.dtype: object внизу относится к самому кадру данных, который всегда будет объектом данных в пандах.

Я надеюсь, что это устранит любые ваши вопросы!

...