Python: scipy.разреженные / панды Нулевые значения в разреженной матрице преобразуются в большое отрицательное целое число

#python #pandas #scipy #null #integer-overflow

Вопрос:

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

 import pickle5 as pk5
from scipy import sparse
import pandas as pd

with open('some_file.pickle', 'rb') as f:
    df = pk5.load(f)
 

Исходный разреженный df выглядит правильно:

df.iloc[0:5, 0:4]) :

  1028799.3_nuc_coding  1156994.3_nuc_coding  1156995.3_nuc_coding
0                   1.0                   NaN                   NaN
1                   NaN                   1.0                   NaN
2                   NaN                   NaN                   NaN
3                   NaN                   NaN                   NaN
4                   NaN                   NaN                   NaN
 

Запуск dropna работает нормально, поэтому на самом деле это нулевые значения.

df.iloc[0].dropna().index[:3]

 Index(['1028799.3_nuc_coding', '1280.11650_nuc_coding',
       '1280.11655_nuc_coding'],
      dtype='object')
 

Но выполнение любой операции над ним изменяет значения NaN на -9223372036854775808. Например, вот df.T :

                                       0                    1  
1028799.3_nuc_coding                    1 -9223372036854775808   
1156994.3_nuc_coding -9223372036854775808                    1   
1156995.3_nuc_coding -9223372036854775808 -9223372036854775808   

                                        2                    3  
1028799.3_nuc_coding -9223372036854775808 -9223372036854775808   
1156994.3_nuc_coding -9223372036854775808 -9223372036854775808   
1156995.3_nuc_coding -9223372036854775808 -9223372036854775808   

                                        4  
1028799.3_nuc_coding -9223372036854775808  
1156994.3_nuc_coding -9223372036854775808  
1156995.3_nuc_coding -9223372036854775808  
 

Я получил аналогичные ошибки с df.iterrows() и с покрытием матрицы coo в scipy, используя приведенный выше код.

 coo_mat = sparse.coo_matrix(df.values, shape=df.shape)
print(coo_mat)
 
 (0, 0)  1
  (0, 1)    -9223372036854775808
  (0, 2)    -9223372036854775808
  (0, 3)    -9223372036854775808
  (0, 4)    -9223372036854775808
  (0, 5)    -9223372036854775808
  (0, 6)    -9223372036854775808
  (0, 7)    -9223372036854775808
  (0, 8)    -9223372036854775808
  (0, 9)    -9223372036854775808
  (0, 10)   -9223372036854775808
  (0, 11)   -9223372036854775808
  (0, 12)   -9223372036854775808
  (0, 13)   -9223372036854775808
  (0, 14)   -9223372036854775808
  (0, 15)   -9223372036854775808
  (0, 16)   -9223372036854775808
  (0, 17)   -9223372036854775808
  (0, 18)   -9223372036854775808
  (0, 19)   -9223372036854775808
  (0, 20)   -9223372036854775808
  (0, 21)   -9223372036854775808
  (0, 22)   -9223372036854775808
  (0, 23)   -9223372036854775808
  (0, 24)   -9223372036854775808
  : :
 

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

1. np.array(np.nan).astype(int) создает то же самое большое отрицательное целое число. np.nan это float .

Ответ №1:

Спасибо @hpaulj за подсказку! Проблема заключалась в том, что мой dtype был int. Так что переделка его в плавающий решает проблему. Пример:

df.iloc[0:5, 0:4].astype(float).T

                           0   1   2    3  4
1028799.3_nuc_coding    1.0 NaN NaN NaN NaN
1156994.3_nuc_coding    NaN 1.0 NaN NaN NaN
1156995.3_nuc_coding    NaN NaN NaN NaN NaN
1156996.3_nuc_coding    NaN NaN NaN NaN NaN
 

Аналогично, другие операции, такие как итерации и приведение к coo_matrix, также работают должным образом, как и ожидалось, после изменения типа на float.