Мне нужно заменить все 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
Я чувствую, что должен быть легкий способ сделать это.Кто-нибудь знает?