我有一个比我在这里显示的数据框更大的数据框,但我想做的是,只要系列中存在特定值(甚至更好的是整个数据框),即可将该值更改为“无”。我需要这些为 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 。我在这里使用日期时间系列,但实际上我需要的不仅仅是日期时间系列。看起来它应该是 pandas 的基本功能,但我找不到答案。
谢谢, 科林
最佳答案
首先,您的代码无法正常工作的原因是这些 NaT
值不是字符串 'NaT'
,它们是值 pd .NaT
。但由于我认为解决这个问题实际上不会给你带来你想要的东西,所以我们暂时忽略它。
Pandas DataFrame
,就像它所构建的 NumPy ndarray
一样,是一个类型化的低级值的紧凑数组。这就是它体积小、速度快且类型安全的原因。但这本质上意味着它只能存储指定类型的值。并且 None
不是 datetime64[ns]
类型的值。
更具体地说,datetime64[ns]
只能保存 64 位整数,将日期时间表示为自纪元以来的纳秒,并且 None
不是 64 位整数.
Pandas 确实有一个特殊的值来处理这个问题,称为 NaT
,即“Not a Time”;这是您可以在任何类型的日期时间字段中获得的最接近 None
的值(就像更熟悉的浮点型 NaN
一样)。这就是您已经拥有的。
同时,Pandas 在各个不同的地方对 None
提供了特殊支持,尝试执行您经常想要的操作 - 存储 NaN/NaT/0,或重复最后一个值,或其他各种东西。但如果这不是您想要的,那就没有太大帮助。
如果您确实需要 None
,唯一的方法是存储普通的装箱 Python 对象,而不是存储键入的低级值,您可以使用 dtype 来实现=对象
。然后,您可以将任何 Python 值粘贴到任何元素中,当然包括 None
。
但是这样做很大程度上违背了使用 Pandas 和 NumPy 的目的。您可能最好使用 NaT
,并更改代码的其余部分 - 要么在您当前期望 None
的地方期望 NaT
,或者将 DataFrame
包装在提取或打印输出期间将 NaT
值转换为 None
的内容中。
为了完整起见,如果您想变得疯狂,没有什么可以阻止您定义一个 optionaldatetime64[ns]
dtype,它就像 datetime64[ns]
,只不过它使用为 NaT
保留的特殊值,表示 None
。或者它甚至可以保留另一个特殊值或整个位来表示 None
,同时保留 NaT
。无论哪种方式,这都将是大量工作,并且它将完全破坏任何依赖于日期时间算术的操作(对于任何 d
,d - NaT == NaT
,但是d - None
是任何 d
的 TypeError
...),最终它并不比我能想到的任何目的的包装解决方案更好...
关于python - 如何用 None 替换字符串值 - python,pandas dataframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29842875/