繁体   English   中英

如何用None替换字符串值-Python,Pandas DataFrame

[英]How to replace a string value with None - python, pandas dataframe

我的数据框比这里显示的要大,但是我想做的是在系列中有某个值(或更好的是整个数据框)的任何地方将其值更改为None。 我需要将它们设置为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。 在实际的数据框中,我通常会抛出一个类型错误,告诉我无法用方法pad替换None。 我在这里使用的是日期时间系列,但实际上我需要的不仅仅是日期时间系列。 似乎它应该是熊猫的基本功能,但我找不到答案。

谢谢,科林

首先,您的代码无法正常工作的原因是这些NaT值不是字符串'NaT'pd.NaTpd.NaT 但是,由于我认为修复该问题实际上并不能满足您的需求,因此暂时不要理会。

像建立在其NumPy ndarray一样,Pandas DataFrame是一个紧凑的,有类型的低值数组。 这就是使它体积小,速度快和类型安全的原因。 但这从本质上意味着它只能存储指定类型的值。 而且None并非datetime64[ns]类型的值。

更具体地说, datetime64[ns]只能保存将64位整数表示日期时间(自纪元以来),并且None不是64位整数。

熊猫确实具有特殊的价值,被称为“不是时间”的NaT 那是您在任何类型的datetime字段中都可以得到的最接近None东西(就像更熟悉的float的NaN一样)。 这就是您已经拥有的。


同时,Pandas在各种不同的地方对None都提供了特殊的支持,它们试图做您经常想要做的事情-存储NaN / NaT / 0或重复最后一个值,或进行其他各种操作。 但是,如果那不是您想要的,那并没有太大帮助。


如果您实际上需要使用None ,那么唯一的方法就是存储普通的装箱的Python对象,而不是使用dtype=object来存储输入的低级值。 然后,您可以将任何Python值粘贴到任何元素中,包括None

但是这样做大大挫败了使用Pandas和NumPy的目的。 您可能最好使用NaT ,并更改其余代码-要么期待NaT到您当前期望的None ,要么将DataFrame包装在提取或打印输出期间将NaTNaTNone中。


为了完整起见,如果您想发疯,没有什么可以阻止您定义与datetime64[ns]相似的optionaldatetime64[ns] dtype的,只是它使用为NaT保留的特殊值来表示None 或者,它甚至可以保留另一个特殊值或一整点,以表示None ,而不必NaT 无论哪种方式,这将是一个很大的工作,它会彻底打破依赖日期时间算术任何操作( d - NaT == NaT任何d ,而d - None是一个TypeError对于任何d ...),最终是就我能想到的任何目的而言,都没有比包装器解决方案更好的…

最后,这满足了我的需求。 我不认为map(str)在我为该问题提供的代码中起作用,但是它在下面的工作原理中仅将其分配给一个字段而不是整个数据框。

def change_date_to_string(field):
    data[field] = data[field].map(str)
    data[field].loc[data[field] == 'NaT'] = None

change_date_to_string(field='usr_datetime')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM