Проверка значений NaN в кадре данных pandas со столбцами int8

1

Как было предложено в вопросе, который я задал на прошлой неделе, эффективным способом хранения столбца со значениями в диапазоне [True, False, NaN] было бы использование int8 -datatype для обозначения True как 1, False как 0 и NaN как -1.

Если я это сделаю, то будет хорошей практикой "переопределить" методы pandas isnull() чтобы также учитывать, что если столбец в dataframe имеет dtype int8, -1 следует считать нулевым значением. Я мог бы подумать об определении новой функции def isnull(v), которая возвращает, если значение имеет значение NaN или -1 в случае dtype int8, но я могу себе представить, что это будет не очень быстрое и эффективное решение (учитывая, что dataframe Я работаю с несколькими гигабайтами большой, и я хочу иметь возможность подсчитать количество "null" -values в столбце /dataframe).

Теги:
pandas
null

1 ответ

4
Лучший ответ

это должно быть довольно быстро...

Сроки для серии 100.000.000 рядов.

In [84]: s = pd.Series(np.random.choice([1,0,-1], 10**8), dtype=np.int8)

In [85]: s.shape
Out[85]: (100000000,)

моделирование series.isnull():

In [86]: %timeit s==-1
87 ms ± 3.51 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [87]: %timeit s.values==-1
84.1 ms ± 2.88 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [88]: %timeit np.where(s==-1)
546 ms ± 14.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [89]: %timeit np.where(s.values==-1)
531 ms ± 2.78 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Моделирование: series.isnull().sum():

In [90]: %timeit (s==-1).sum()
1.39 s ± 38.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [91]: %timeit (s.values==-1).sum()
181 ms ± 1.88 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

PS обратите внимание, что для подсчета (суммирования) их разности между (s==-1).sum() и (s.values==-1).sum() довольно заметна

  • 0
    Просто чтобы подтвердить, вы бы использовали num_null_values = (s.values == -1).sum() .
  • 0
    @FHTMitchell, да, спасибо! Я пропустил самую последнюю часть: and I want to be able to count the amount of "null"-values

Ещё вопросы

Сообщество Overcoder
Наверх
Меню