Как заменить NaN и NaT на None - pandas 0.24.1 - PullRequest
0 голосов
/ 09 июля 2019

Мне нужно заменить все NaN и NaT в pandas.Series на None.

Я пробовал это:

def replaceMissing(ser):
    return ser.where(pd.notna(ser), None)

Но это не работает:

import pandas as pd

NaN = float('nan')
NaT = pd.NaT

floats1 = pd.Series((NaN, NaN, 2.71828, -2.71828))
floats2 = pd.Series((2.71828, -2.71828, 2.71828, -2.71828))
dates = pd.Series((NaT, NaT, pd.Timestamp("2019-07-09"), pd.Timestamp("2020-07-09")))


def replaceMissing(ser):
    return ser.where(pd.notna(ser), None)


print(pd.__version__)
print(80*"-")
print(replaceMissing(dates))
print(80*"-")
print(replaceMissing(floats1))
print(80*"-")
print(replaceMissing(floats2))

Как видите, NaT не был заменен:

0.24.1
--------------------------------------------------------------------------------
0          NaT
1          NaT
2   2019-07-09
3   2020-07-09
dtype: datetime64[ns]
--------------------------------------------------------------------------------
0       None
1       None
2    2.71828
3   -2.71828
dtype: object
--------------------------------------------------------------------------------
0    2.71828
1   -2.71828
2    2.71828
3   -2.71828
dtype: float64

Затем я попробовал этот дополнительный шаг:

def replaceMissing(ser):
    ser = ser.where(pd.notna(ser), None)
    return ser.replace({pd.NaT: None})

Но все равноне работает.По какой-то причине он возвращает NaN с:

0.24.1
--------------------------------------------------------------------------------
0                   None
1                   None
2    2019-07-09 00:00:00
3    2020-07-09 00:00:00
dtype: object
--------------------------------------------------------------------------------
0        NaN
1        NaN
2    2.71828
3   -2.71828
dtype: float64
--------------------------------------------------------------------------------
0    2.71828
1   -2.71828
2    2.71828
3   -2.71828
dtype: float64

Я также пытался преобразовать серию в object:

def replaceMissing(ser):
    return ser.astype("object").where(pd.notna(ser), None)

Но теперь последняя серия также object хотя в нем нет пропущенных значений:

0.24.1
--------------------------------------------------------------------------------
0                   None
1                   None
2    2019-07-09 00:00:00
3    2020-07-09 00:00:00
dtype: object
--------------------------------------------------------------------------------
0       None
1       None
2    2.71828
3   -2.71828
dtype: object
--------------------------------------------------------------------------------
0    2.71828
1   -2.71828
2    2.71828
3   -2.71828
dtype: object

Я бы хотел, чтобы оно оставалось float64.Поэтому я добавляю infer_objects:

def replaceMissing(ser):
    return ser.astype("object").where(pd.notna(ser), None).infer_objects()

Но это снова возвращает NaN s:

0.24.1
--------------------------------------------------------------------------------
0                   None
1                   None
2    2019-07-09 00:00:00
3    2020-07-09 00:00:00
dtype: object
--------------------------------------------------------------------------------
0        NaN
1        NaN
2    2.71828
3   -2.71828
dtype: float64
--------------------------------------------------------------------------------
0    2.71828
1   -2.71828
2    2.71828
3   -2.71828
dtype: float64

Я чувствую, что должен быть легкий способ сделать это.Кто-нибудь знает?

1 Ответ

1 голос
/ 09 июля 2019

Для меня рабочий порядок изменения вашего второго решения, протестированного в 0.24.2, но dtype s изменяется на объект, потому что смешанные типы - None s с float s или timestamp s:

def replaceMissing(ser):
    return ser.replace({pd.NaT: None}).where(pd.notna(ser), None)

print(pd.__version__)
print(80*"-")
print(replaceMissing(dates))
print(80*"-")
print(replaceMissing(dates).apply(type))
print(80*"-")
print(replaceMissing(floats1))
print(80*"-")
print(replaceMissing(floats1).apply(type))
print(80*"-")
print(replaceMissing(floats2))

0.24.2
--------------------------------------------------------------------------------
0                   None
1                   None
2    2019-07-09 00:00:00
3    2020-07-09 00:00:00
dtype: object
--------------------------------------------------------------------------------
0                                   <class 'NoneType'>
1                                   <class 'NoneType'>
2    <class 'pandas._libs.tslibs.timestamps.Timesta...
3    <class 'pandas._libs.tslibs.timestamps.Timesta...
dtype: object
--------------------------------------------------------------------------------
0       None
1       None
2    2.71828
3   -2.71828
dtype: object
--------------------------------------------------------------------------------
0    <class 'NoneType'>
1    <class 'NoneType'>
2       <class 'float'>
3       <class 'float'>
dtype: object
--------------------------------------------------------------------------------
0    2.71828
1   -2.71828
2    2.71828
3   -2.71828
dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...