【发布时间】:2015-04-27 21:21:12
【问题描述】:
我有一个比我在这里展示的更大的数据框,但我想要做的是在序列中存在特定值的地方(或者甚至更好的是整个数据框)将该值更改为无。我需要将这些设置为 None,这样我就可以将数据帧写入数据库,它将被识别为 null。
series = (['2014/06/05 13:03:56', '2014/07/23 13:03:56', None, '2014/08/21 13:03:56'])
data = pd.DataFrame(series)
0 2014/06/05 13:03:56
1 2014/07/23 13:03:56
2 None
3 2014/08/21 13:03:56
data = pd.to_datetime(data[0], coerce=True)
data
0 2014-06-05 13:03:56
1 2014-07-23 13:03:56
2 NaT
3 2014-08-21 13:03:56
Name: 0, dtype: datetime64[ns]
data = data.map(str)
data
0 2014-06-05 13:03:56
1 2014-07-23 13:03:56
2 NaT
3 2014-08-21 13:03:56
Name: 0, dtype: object
data.replace(to_replace='NaT', value=None)
0 2014-06-05 13:03:56
1 2014-07-23 13:03:56
2 2014-07-23 13:03:56
3 2014-08-21 13:03:56
Name: 0, dtype: object
在上面的示例中,当我尝试替换“NaT”时,数据框实际上会用前面的值而不是 None 填充值。这无济于事,因为它必须是无。在我正在使用的实际数据框中,这通常会引发一个类型错误,告诉我我不能用方法垫替换 None 。我在这里使用日期时间系列,但实际上我需要的不仅仅是日期时间系列。似乎它应该是熊猫的基本功能,但我找不到答案。
谢谢, 科林
【问题讨论】:
-
NaT不是字符串,它是一个特殊的“不是时间”值,类似于浮点数的NaN。因此,只需将to_replace='NaT'更改为to_replace=pd.NaT,它就会完成您想做的事情。但我不认为你想做的就是你真正想要的。 -
@abarnert 将 dtype 转换为 object,日期时间将转换为一些 int 值:
In [506]: df.replace(pd.NaT, 'None') Out[506]: 0 1401973436000000000 1 1406120636000000000 2 None 3 1408626236000000000 Name: 0, dtype: object -
@EdChum:这就是为什么我说“我不认为你想做的就是你真正想要的”。
-
@EdChum:此外,您的代码将 NaT 替换为字符串
'None',这会导致 不同 问题,然后将其替换为实际的None会。并不是说任何一个都是他真正想要的,但是…… Pandas 试图以半智能的方式处理None值;有时它们会转换为 NaN/NaT/0,有时它们的意思是“重复最后一个值”等。但是'None'没有任何特殊含义;就是“一些不知道怎么处理的值,还是换object吧”。 -
@EdChum:我不知道总体上是好是坏……但由于这正是他偶然得到的行为并且想知道如何摆脱,我想我会有同意你的观点,在这个用户的情况下情况更糟。 :)