2016-11-24 2 views
3

Я импортирую данные из файлов Excel, которые поступают из другого офиса. В одной из столбцов для каждой ячейки у меня есть списки чисел, используемых в качестве тегов. Они были вручную вставлены разными людьми и (моя догадка) с использованием компьютеров с разными тысячами настроек, поэтому результат очень неоднородный.Как правильно разобрать текстовые числа, разделенные смешанными запятыми и точками в файле excel, используя Python?

В качестве примера у меня есть:

tags= ['205', '306.3', '3,206,302','7.205.206'] 

Если это файл CSV (я попытался преобразующий один файл, чтобы проверить), используя

pd.read_csv(my_file,sep=';') 

дал бы мне точно указанное выше список ,

К сожалению, как было сказано, мы говорим о первенствовать файлов (множественное число), и мне приходится иметь дело с ним, и с помощью

pd.read_excel(my_file,sheetname=my_sheet,encoding='utf-16',converters{'my_column':str}) 

что я получаю вместо этого:

tags= ['205', '306.3', '3,206,302','7205206'] 

Как вам см., всякий раз, когда число может быть выражено логически в тысячах (так, а не второе число в моем списке) точка распознается как разделитель тысяч, и я получаю одиночное число, а не три.

Я пробовал читать документацию и искать в stackoverflow и google, но ключевые слова для описания этой проблемы слишком расплывчаты, и я пока не нашел жизнеспособного решения.

Как я могу получить правильный список, используя файлы excel?

Спасибо.

+0

Являются ли цифры, хранящиеся по-разному в Excel или только отформатированные по-разному? – asongtoruin

+0

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

ответ

3

Эта проблема, вероятно, происходит потому, что pandas is running their number parser before their date parser.

Одним из возможных исправлений является добавление разделителя тысяч. Например, если вы на самом деле, используя «» в качестве разделителя тысяч, вы можете добавить в thousands=',' читателя первенствовать:

pd.read_excel(my_file,sheetname=my_sheet,encoding='utf-16',thousands=',',converters{'my_column':str}) 

Вы также можете выбрать произвольный тысяч сепаратор, который не существует в ваших данных, чтобы сделать выход остается таким же, если thousands=None (which should be the default according to documentation), не имеет отношения к вашей проблеме. Вы также должны убедиться, что вы конвертируете поля в str (в этом случае использование тысяч является избыточным, поскольку оно не применяется к тэгам в любом случае).

EDIT:

Я попытался с помощью следующих фиктивных данных ('test.xlsx'):

a b  c   d 
205 306.3 3,206,302 7.205.206 

и

dataf = pandas.read_excel('test.xlsx', header=0, converters={'a':str, 'b':str,'c':str,'d':str}) 
print(dataf.to_string) 

я получил следующий вывод:

Columns: [205, 306.3, 3,206,302, 7.205.206] 

Что такое exac что вы искали.Уверены ли вы, что у вас установлена ​​последняя версия панд, и что вы на самом деле не используете converters = {'col':int} или float в ключе вашего ключевого слова?

Как бы то ни было, похоже, что вы преобразовываете свои поля в числовые (int или float), или есть проблема в другом месте вашего кода. Pandas read_excel работает, как описано, и я могу получить результаты, указанные вами с указанным выше кодом. В других случаях: ваш код должен работать, если это не может быть из-за устаревшей версии pandas, других частей вашего кода или даже проблем с исходными данными. В его нынешнем виде невозможно ответить на ваш вопрос с предоставленной вами информацией.

+0

Это, к сожалению, не решает проблему (я уже пробовал это), потому что использование разделителя тысяч преобразует теги в один номер, который не то, что я ищу (помните: это разные теги, разделенные запятыми и точками) , – Shark8

+0

Так что, используя 'тыс. = ';'' Например, исправить свою проблему как грязное обходное решение? Это похоже на надзор в пандах и краевом случае. –

+0

Я не понимаю, почему 'тыс. = ';'' Должно отличаться от 'тыс. = ',' '(В любом случае я пробовал, а это не так). – Shark8

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