2013-08-27 6 views
6

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

import pandas as pd 
df = pd.DataFrame({'a':['1']*100000 + ['X']*100000 + ['1']*100000, 'b':['b']*300000}) 
df.to_csv('test', sep='\t', index=False, na_rep='NA') 
df2 = pd.read_csv('test', sep='\t') 
print df2['a'].unique() 
for a in df2['a'][262140:262150]: 
    print repr(a) 

выход:

['1' 'X' 1] 
'1' 
'1' 
'1' 
'1' 
1 
1 
1 
1 
1 
1 

Интересно 262144 является степенью 2 поэтому я думаю, что вывод и преобразование происходит в кусках, но пропускают некоторые куски.

Я абсолютно уверен, что это ошибка, но хотелось бы работа вокруг, что, возможно, использует квотирование, хотя добавление цитирование = csv.QUOTE_NONNUMERIC для чтения и записи не решить эту проблему. В идеале я мог бы обойти это, указав мои строковые данные и каким-то образом заставил панды не делать никаких выводов по цитируемым данным.

Использование панды 0.12.0

+2

[docs] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html), похоже, что это сработает: 'pd.read_csv (' test ', sep =' \ t ', converters = {' a ': str}) '. –

+0

@StevenRumbalski и он полностью делает! Вы должны добавить это как ответ! –

+0

@ AndyHayden: Спасибо. –

ответ

5

Вы обманули read_csv парсер здесь (и быть справедливым, я не думаю, что это может всегда можно ожидать выхода правильно, независимо от того, что вы на него) ... но да, это может быть a bug!

Как @Steven указывает вы можете использовать преобразователи аргумент read_csv:

df2 = pd.read_csv('test', sep='\t', converters={'a': str}) 

Ленивый решение является только залатать это после вы читали в файле:

In [11]: df2['a'] = df2['a'].astype('str') 

# now they are equal 
In [12]: pd.util.testing.assert_frame_equal(df, df2) 

Примечание. Если вы ищете решение для хранения DataFrames, например между сессиями, как pickle, так и HDF5Store - отличные решения, которые не будут затронуты этими типами парсинговых ошибок (и будут значительно быстрее). См: How to store data frame using PANDAS, Python

+0

это мой откат, но включает в себя дополнительные строки кода каждый раз, когда я читаю файл, который я пытался избежать – andrew

+0

решение, вероятно, не должно использовать to_csv/read_csv для хранения данных DataFrames, to_pickle или hdf5_store - гораздо лучшие решения (и ни один из них не будет затронутый такой ошибкой синтаксического анализа). –

+0

@ user1068490 обновлен ссылкой на другой ответ об этом –

6

Чтобы избежать Панды вывести тип данных, обеспечивают convertersread_csv аргумент:

converters: Dict. факультативно

Dict функций для преобразования значений в определенные столбцы. Ключи могут быть либо целые числа или метки столбцов

Для вашего файла это будет выглядеть так:

df2 = pd.read_csv('test', sep='\t', converters={'a':str}) 

Мое чтение документации является то, что вам не нужно указывать конвертеры для каждого столбца. Панды должны продолжать определять тип данных неуточненных столбцов.

Смежные вопросы