2013-03-21 4 views
6

Как я могу использовать pd.read_csv() итеративно кусок через файл и сохранить DTYPE и другие мета-информацию, как если бы я прочитал во всем наборе сразу?Получить выведенные типы dataframe итеративно с использованием chunksize

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

Если первый фрагмент, хранящийся в таблице, содержит только int, а последующий фрагмент содержит поплавок, будет создано исключение. Поэтому мне нужно сначала выполнить итерацию с помощью read_csv и сохранить наивысший. Кроме того, для типов объектов мне нужно сохранить максимальную длину, поскольку они будут храниться в виде строк в таблице.

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

ответ

8

Я не думал, что это будет интуитивно понятным, иначе я бы не опубликовал вопрос. Но в очередной раз панды делают ветер ветерок. Тем не менее, сохраняя вопрос, как эта информация может быть полезной для тех, кто работает с большими данными:

In [1]: chunker = pd.read_csv('DATASET.csv', chunksize=500, header=0) 

# Store the dtypes of each chunk into a list and convert it to a dataframe: 

In [2]: dtypes = pd.DataFrame([chunk.dtypes for chunk in chunker]) 

In [3]: dtypes.values[:5] 
Out[3]: 
array([[int64, int64, int64, object, int64, int64, int64, int64], 
     [int64, int64, int64, int64, int64, int64, int64, int64], 
     [int64, int64, int64, int64, int64, int64, int64, int64], 
     [int64, int64, int64, int64, int64, int64, int64, int64], 
     [int64, int64, int64, int64, int64, int64, int64, int64]], dtype=object) 

# Very cool that I can take the max of these data types and it will preserve the hierarchy: 

In [4]: dtypes.max().values 
Out[4]: array([int64, int64, int64, object, int64, int64, int64, int64], dtype=object) 

# I can now store the above into a dictionary: 

types = dtypes.max().to_dict() 

# And pass it into pd.read_csv fo the second run: 

chunker = pd.read_csv('tree_prop_dset.csv', dtype=types, chunksize=500) 
+0

вы можете также использовать SkipRows = список пропускаемых строк, и это пропустить каждую строку в 1-9 так ур выборки только каждые 10-й строки будут намного быстрее (и попробуйте получить ответ u want), я думаю, вам нужно будет генерировать это из пропущенных строк самостоятельно – Jeff

+0

@Jeff Как бы вы это получили, не зная общего количества строк в csv, что повлечет за собой чтение всего этого в – Luke

+3

Вы также должны рассмотреть возможность выбора max dtypes после каждой итерации блока, вместо того, чтобы хранить все типы dtypes и уменьшать их в конце. Например, csv с строками 2MM и размером куска 500 будет приводить к 400 000 строк в кадре! – jastr