2016-04-26 3 views
1

У меня есть dataframe df, который разреженный и эффективность использования памяти я желаю, чтобы преобразовать его с помощью to_sparse()Определение DTYPE из df.to_sparse() результата

Однако, кажется, что новое представление заканчивается с dtype=float64, даже если мой df является dtype=int8.

Есть ли способ указать тип данных/предотвратить автоматическое преобразование в dtype=float64 при использовании to_sparse()?

ответ

1

Вкратце. №

Видите ли, dtypes не является объектом, контролируемым пандами. Dtypes, как правило, много. Dtypes не контролируются каким-либо образом, они автоматически записываются numpy и могут изменяться только при изменении данных внутри массива данных или массива numpy.

Это говорит о том, что типичная причина для завершения с поплавком вместо int как dtype - это введение значений NaN в массив рядов или numpy. Некоторые говорят, что это панды. Я лично утверждаю, что это связано с (слишком) тесной связью между пандами и numpy.

В общем, dtypes никогда нельзя доверять ни на что, они невероятно ненадежны. Я думаю, что все, кто работает с numpy/pandas, будут жить лучше, если они никогда не будут подвержены дтипам вообще.

Если вы действительно ненавидите поплавки, единственный вариант для вас, насколько я знаю, заключается в использовании строковых представлений, что, конечно же, вызывает в большинстве случаев еще больше проблем.

+0

Спасибо за блестящее объяснение. Мне было интересно: «Типичная причина, связанная с поплавком вместо int как dtype, связана с введением значений NaN в ряд или массив numpy», если я использую 'df.fillna (0) .to_sparse (fillvalue = 0) 'Я не получаю значения NaN. Однако это не решает проблему. Мне не хватало прочтения между строками из вашего объяснения? – Segmented

+0

numpy не изменяет автоматически dtype float на dtype int, потому что в нем нет значений NaN. Очевидно, что в некоторой точке преобразования .to_sparse() были значения NaN. Вы можете попробовать добавить '.astype (int)' в конце, он изменит dtypes на int, но это еще один шаг, который будет стоить вам производительности. – firelynx

+0

Спасибо за объяснение! – Segmented

1

Подглядывание под капотом, Редкая реализация рамки на pandas.sparse.frame Мы видим, что метод astype() по-прежнему ожидает исполнения начиная с версии 0.18.0. Ref. Github

Когда у нас есть некоторые реализации на месте, преобразование dtype должно работать как pandas.core.frame (Панды DataFrame). Учитывая панду DataFramedf мы могли бы преобразовать его в SparseDataFrame и указать dtype

df.to_sparse().astype(dtype) 

ATM, SparseDataFrame не имеет много поддержки dtype, но в настоящее время разрабатываются. Обратитесь к этой проблеме, которую я открыл Github.

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