2015-07-22 2 views
1

Учитывая это значительно упрощенный test.csv файл:Как отсортировать численно, но read_csv с dtype = object?

wrong 
8 
7 
6 
3 
1 
2 
4 
5 
9 
10 

и этот код:

#!/usr/bin/python 
import pandas as pd 

data = pd.read_csv('test.csv', dtype=object) 
counts=data['wrong'].value_counts(dropna=False) 
counts_converted=counts.convert_objects(convert_numeric=True) 

print counts_converted.sort_index() 

производит следующий вывод:

1  1 
10 1 
2  1 
3  1 
4  1 
5  1 
6  1 
7  1 
8  1 
9  1 
dtype: int64 

Почему последний оператор печати не Рассортируйте индекс 1-10?

Мне нужно заставить объект dtype объект, когда считывается файл csv, чтобы преодолеть некоторые проблемы с обнаружением смешанных символов, даты и числовых форматов в столбцах, поэтому удаление этого оператора не будет работать для меня.

Я думал, что могу просто преобразовать серию в числовое, но, похоже, это не работает.

Редактирование вопроса, так как комментирование не позволяло мне использовать клавишу «Ввод», не публикуя комментарий ... [Ahh, нашел много длинного разговора об этой функции. Shift-Enter работает.]

@ EdChum предлагает решение для упрощенного случая, но не работает с производственными данными. Рассмотрим несколько менее простой файл данных:

wrong,right 
8,a 
7,b 
6,c 
3,d 
1, 
2,f 
4,g 
5,h 
9,i 
10,j 
,k 
11,l 

Пустое значение на второй до последней строки вызывает ошибку «не может конвертировать поплавок NaN в целое.»

У меня есть много NaNs (все пустые), которые нужно хранить и подсчитывать в значении_сочетания.

Другие пустые ячейки, похоже, появляются как очень большие отрицательные числа (т. Е. -5226413792388707240) после литья в int64.

Извините заранее за любую тупость с моей стороны! Спасибо за помощь.

+0

Вы читали значение, как 'object' это делает значение' str' в сущности, вы называете 'value_counts' который затем устанавливает индекс в ваши значения, затем вызывается 'convert_objects', но это не имеет никакого эффекта, так как это ваш индекс, который нуждается в преобразовании – EdChum

ответ

1

Добавление astype после прочтения делает его сортировкой надлежащим образом.

Вы упомянули, что вам нужно разобраться с некоторыми смешанными символами, датами и т. Д., Сделать это до astype, и все должно быть хорошо.

import pandas as pd 

data = pd.read_csv('/home/mikael/test.csv', dtype=object) 

# Sanitize your data here 

data['wrong'] = data['wrong'].astype(int) 
counts=data['wrong'].value_counts(dropna=False) 
counts_converted=counts.convert_objects(convert_numeric=True) 

print counts_converted.sort_index() 

1  1 
2  1 
3  1 
4  1 
5  1 
6  1 
7  1 
8  1 
9  1 
10 1 
dtype: int64 
1

Проблема здесь в том, что вы назвали value_counts на ФР до любого преобразования типа, так что ваш индекс value_counts еще object DTYPE который является str:

In [59]: 

t="""wrong 
8 
7 
6 
3 
1 
2 
4 
5 
9 
10""" 
df = pd.read_csv(io.StringIO(t), dtype=object) 
counts=df['wrong'].value_counts(dropna=False) 
counts.index 
Out[59]: 
Index(['4', '6', '2', '9', '3', '10', '5', '1', '8', '7'], dtype='object') 

Вызов convert_objects преобразует данные не индекс ,

Если вы накладываете свой тип индекса к np.int64 то сортирует правильно:

counts.index = counts.index.astype(np.int64) 
counts.sort_index() 
Out[74]: 
1  1 
2  1 
3  1 
4  1 
5  1 
6  1 
7  1 
8  1 
9  1 
10 1 
dtype: int64 
Смежные вопросы