Reputation: 2541
I have been struggling with this question for a long while, and I tried different methods.
I have a simple DataFrame as shown,
I can use code to replace NaN
with None
(Not String "None"),
[![dfTest2 = dfTest.where(pd.notnull(dfTest), None)][2]][2]
I support that NaT
is also classified as 'Null' because the following,
However, NaT
is not replaced with None
.
I have been searching for answers but got no luck. Anyone could Help?
Thank you in advance.
Upvotes: 52
Views: 122284
Reputation: 75
So I'm a little late to the party, but this result also worked for me.
`
import pandas as pd
df["column"] = df["column"].replace({pd.NaT: None})
`
Upvotes: 2
Reputation: 478
I see a couple of other similar answers here, though none are as simple as this:
df.replace([pd.NaT], [None])
Upvotes: 0
Reputation: 129
This looks strange but worked for me. Pandas version 14.1
import numpy as np
df = df.replace(np.NaN, 0).replace(0, None)
Before LastModifiedDate NaT
After LastModifiedDate None
Upvotes: 0
Reputation: 935
df.fillna(None)
only works for np.na
but not pd.NaT
. However doing df.replace({np.nan: None})
replaces both pd.NaT
and np.na
with None
.
# Initalize a sample dataframe
df = pd.DataFrame({
'start_date': pd.to_datetime(['2017-06-01', pd.NaT]),
'amount':[2997373, np.nan]
})
display(df)
# Then replace pd.NaT and np.na with None
df = df.replace({np.nan: None})
display(df)
Upvotes: 8
Reputation: 39850
If you don't want to change the type of the column, then another alternative is to to replace all missing values (pd.NaT
) first with np.nan
and then replace the latter with None
:
import numpy as np
df = df.fillna(np.nan).replace([np.nan], [None])
Upvotes: -1
Reputation: 1007
The simplest solution I found that worked for me is...
Input:
import pandas as pd
import numpy as np
dfTest = pd.DataFrame(dict(InvoiceDate=pd.to_datetime(['2017-06-01', pd.NaT]), CorpId=[2997373, np.nan], TestName=[1,1]))
dfTest.replace({np.nan: None}, inplace = True)
Output of dfTest:
Upvotes: 35
Reputation: 634
Similar approach as suggested by @neerajYadav but without the apply
:
dfTest2['InvoiceDate'] = (dfTest2['InvoiceDate']
.astype(str) # <- cast to string to simplify
# .replace() in newer versions
.replace({'NaT': None} # <- replace with None
)
Upvotes: 2
Reputation: 99
Make the column type as str first
dfTest2.InvoiceDate = dfTest2.InvoiceDate.astype(str)
then compare it directly with "NaT" and replace with None
dfTest2.InvoiceDate = dfTest2.InvoiceDate.apply(lambda x : None if x=="NaT" else x)
Upvotes: 5
Reputation: 294358
Make the dtype
object
dfTest2 = pd.DataFrame(dict(InvoiceDate=pd.to_datetime(['2017-06-01', pd.NaT])))
dfTest2.InvoiceDate.astype(object).where(dfTest2.InvoiceDate.notnull(), None)
0 2017-06-01 00:00:00
1 None
Name: InvoiceDate, dtype: object
Upvotes: 52