панды заменяют 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