панды вырезали серию с нан значениями - PullRequest
0 голосов
/ 31 октября 2018

Я бы хотел применить функцию «Вырезать панд» к серии, включающей NaN. Желаемое поведение состоит в том, что он объединяет элементы, отличные от NaN, и возвращает NaN для элементов NaN.

import pandas as pd
numbers_with_nan = pd.Series([3,1,2,pd.NaT,3])
numbers_without_nan = numbers_with_nan.dropna()

Резка отлично работает для серии без NaNs:

pd.cut(numbers_without_nan, bins=[1,2,3], include_lowest=True)
0      (2.0, 3.0]
1    (0.999, 2.0]
2    (0.999, 2.0]
4      (2.0, 3.0]

Когда я вырезал серию, содержащую NaN, элемент 3 правильно возвращается как NaN, но последний элемент получает неправильный назначенный лот:

pd.cut(numbers_with_nan, bins=[1,2,3], include_lowest=True)
0      (2.0, 3.0]
1    (0.999, 2.0]
2    (0.999, 2.0]
3             NaN
4    (0.999, 2.0]

Как получить следующий вывод?

0      (2.0, 3.0]
1    (0.999, 2.0]
2    (0.999, 2.0]
3             NaN
4      (2.0, 3.0]

1 Ответ

0 голосов
/ 31 октября 2018

Это странно. Проблема не в pd.NaT, а в том, что ваша серия имеет object dtype вместо обычной числовой серии, например float, int.

Быстрое решение - заменить pd.NaT на np.nan через fillna. Это запускает последовательное преобразование из object в float64 dtype, а также может привести к повышению производительности.

s = pd.Series([3, 1, 2, pd.NaT, 3])

res = pd.cut(s.fillna(np.nan), bins=[1, 2, 3], include_lowest=True)

print(res)

0    (2, 3]
1    [1, 2]
2    [1, 2]
3       NaN
4    (2, 3]
dtype: category
Categories (2, object): [[1, 2] < (2, 3]]

Более обобщенным решением является предварительное преобразование в числовое значение:

s = pd.to_numeric(s, errors='coerce')
...