Pandas DataFrame将NaT替换为None

Hai*_*gSu 12 dataframe python-2.7 pandas

我一直在努力解决这个问题,我尝试了不同的方法.

我有一个简单的DataFrame,如图所示,

在此输入图像描述

我可以使用代码替换NaNNone(Not String"None"),

[![dfTest2 = dfTest.where(pd.notnull(dfTest), None)][2]][2]

在此输入图像描述

我支持也NaT被归类为'Null',因为以下内容, 在此输入图像描述

但是,NaT不会被替换None.

我一直在寻找答案,但没有运气.有人可以帮忙吗?

先感谢您.

piR*_*red 18

制作 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
Run Code Online (Sandbox Code Playgroud)

  • 我不想改变对象的类型,只想要日期时间格式,所以这个解决方案对我不起作用。 (2认同)

dsh*_*man 13

我发现对我有用的最简单的解决方案是......

输入:

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)
Run Code Online (Sandbox Code Playgroud)

dfTest 的输出:

在此处输入图片说明


Jan*_*mbi 7

df.fillna(None)只适用于np.na但不适用pd.NaT。然而,doingdf.replace({np.nan: None})pd.NaTandnp.na都替换为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)
Run Code Online (Sandbox Code Playgroud)


小智 5

首先将列类型设为str

 dfTest2.InvoiceDate =  dfTest2.InvoiceDate.astype(str)
Run Code Online (Sandbox Code Playgroud)

然后直接与“NaT”比较并替换为None

dfTest2.InvoiceDate = dfTest2.InvoiceDate.apply(lambda x : None if x=="NaT" else x)
Run Code Online (Sandbox Code Playgroud)