панды заменяют NaN на None проявляет нелогичное поведение
Учитывая серию
s = pd.Series([1.1, 1.2, np.nan])
s
0 1.1
1 1.2
2 NaN
dtype: float64
Если возникает необходимость преобразовать NaN в None (например, для работы с паркетами), то я хотел бы иметь
0 1.1
1 1.2
2 None
dtype: object
Я бы предположил, что Series.replace
был бы очевидным способом сделать это, но вот что возвращает функция:
s.replace(np.nan, None)
0 1.1
1 1.2
2 1.2
dtype: float64
NaN был заполнен вперед, а не заменен. Просматривая документы, я вижу, что если вторым аргументом является None, то первым аргументом должен быть словарь. Исходя из этого, я ожидал бы replace
либо заменить, как предполагалось, либо сгенерировать исключение.
Я считаю, что обходной путь здесь
pd.Series([x if pd.notna(x) else None for x in s], dtype=object)
0 1.1
1 1.2
2 None
dtype: object
Что хорошо. Но я хотел бы понять, почему это происходит, документировано ли это, или это просто ошибка, и мне нужно стереть свой профиль git и зарегистрировать его на трекере проблем... какие-нибудь идеи?
Ответы
Ответ 1
Это поведение находится в документации параметра method
:
method : {‘pad, ‘ffill, ‘bfill, None}
The method to use when for replacement, when to_replace is a scalar, list or tuple and value is None.
Так что в вашем примере to_replace
является скаляром, а value
равно None
. По умолчанию это метод pad
из документации по fillna:
pad / ffill: propagate last valid observation forward to next valid