Страницы

Поиск по вопросам

четверг, 14 марта 2019 г.

Почему при сортировке данных получаются числа в другом формате?

Имеются данные которые нужно подготовить к объединению с другим блоком данных. Для этого хотелось бы хронологично упорядочить их. Пример исходных данных:
df1
pid syear pgsbil pgfamstd \ 0 101 1984 [3] Fachhochschulreife [1] verheiratet zus. 1 101 1985 [3] Fachhochschulreife [1] verheiratet zus. 2 101 1986 [3] Fachhochschulreife [1] verheiratet zus. ... ... ... ... 6 102 1984 [1] Hauptschulabschluss [1] verheiratet zus. 7 102 1985 [1] Hauptschulabschluss [1] verheiratet zus. ... ... ... ... 484168 31433802 2012 [2] Realschulabschluss [1] verheiratet zus. 484169 31433901 2012 [4] Abitur [2] verheiratet getr.
Я пробовал отсортировать используя код:
DF1 = df1.sort_values(by='syear', ascending=1)
Но вместо года я получаю, по моему мнению, его в другой кодировке (как и всё остальное!):
Df1 Out[53]: pid syear pgsbil pgfamstd \ 248899 320797655 -32656 81 -95 248825 891723238 -32419 43 43 250014 345587954 -32377 NaN -119 ... ... ... ... 250163 957561202 31108 -91 27 250166 449665857 31554 -1 -1
Почему при сортировке данных получаются числа в другом формате? Как мне исправить это?


Ответ

похоже у вас в колонке syear или действительно отрицательные числа или, что скорее всего, большие положительные (больше 32767), которые при типе данных np.int16 превращаются в отрицательные...
Демо:
информация о max() и min() для типа np.int16
In [67]: np.iinfo(np.int16) Out[67]: iinfo(min=-32768, max=32767, dtype=int16)
как из большого положительного целого (32880) получется отрицательное (-32656) при использовании типа np.int16
In [72]: df = pd.DataFrame({'a':[32880]}, dtype=np.int16)
In [73]: df Out[73]: a 0 -32656
неправильные ("плохие") года:
In [88]: df1.query('syear <= 1980 or syear > 2016').syear Out[88]: 248737 -9076 248738 -26593 248739 1725 248740 -25171 248741 7963 248742 27137 248743 19854 248744 26738 248745 6716 248746 9885 248747 19361 248748 -19726 248749 -24605 248750 24074 248751 -8070 248752 -16027 248753 -23424 248754 3848 248755 1471 248756 30634 248757 -8162 248758 -18937 248759 16733 248760 -21923 248761 16817 248762 3834 248763 -13556 248764 -16229 248765 24272 248766 25642 ... 252510 -1 252511 -1 252512 -1 252513 -1 252514 -1 252515 -1 252516 -1 252517 -1 Name: syear, dtype: int16
Интересное наблюдение - все "плохие" данные идут непрерывным блоком (с индексами: 248737 - 252517)

Комментариев нет:

Отправить комментарий