美文网首页我爱编程
pandas写入数据库不支持NaN

pandas写入数据库不支持NaN

作者: Eric_Zeng | 来源:发表于2017-01-16 17:47 被阅读552次

    引用地址:http://www.huochai.mobi/p/d/6669256/

    支持写入数据库

    往数据库中写入时NaN不可处理,需转换成None,否则会报错。这个这里就不演示了。

    相信作为pandas老司机, 至少能想出两种替换方法。

    In[53]:

    s=Series([None,NaN,'a'])

    s

    Out[53]:

    0None

    1NaN

    2a

    dtype:object

    方案1

    In[54]:

    s.replace([NaN],None)

    Out[54]:

    0None

    1None

    2a

    dtype:object

    方案2

    In[55]:

    s[s.isnull()]=None

    s

    Out[55]:

    0None

    1None

    2a

    dtype:object

    然而这么就觉得完事大吉的话就图样图森破了, 看下面的例子

    In[56]:

    s=Series([NaN,1])

    s

    Out[56]:

    0NaN

    11.0

    dtype:float64

    In[57]:

    s.replace([NaN],None)

    Out[57]:

    0NaN

    11.0

    dtype:float64

    In[58]:

    s[s.isnull()]=None

    s

    Out[58]:

    0NaN

    11.0

    dtype:float64

    当其他数据是int或float时,Series又一声不吭的自动把None替换成了NaN。

    这时候可以使用第三种方法处理

    In[59]:

    s.where(s.notnull(),None)

    Out[59]:

    0None

    11

    dtype:object

    where语句会遍历s中所有的元素,逐一检查条件表达式, 如果成立, 从原来的s取元素; 否则用None填充。 这回没有自动替换成NaN

    None vs NaN要点总结

    在pandas中, 如果其他的数据都是数值类型, pandas会把None自动替换成NaN, 甚至能将s[s.isnull()]= None,和s.replace(NaN, None)操作的效果无效化。 这时需要用where函数才能进行替换。

    None能够直接被导入数据库作为空值处理, 包含NaN的数据导入时会报错。

    numpy和pandas的很多函数能处理NaN,但是如果遇到None就会报错。

    None和NaN都不能被pandas的groupby函数处理,包含None或者NaN的组都会被忽略。

    等值性比较的总结:(True表示被判定为相等)

    None对NoneNaN对NaNNone对NaN

    单值TrueFalseFalse

    tuple(整体)TrueTrueFalse

    np.array(逐个)TrueFalseFalse

    Series(逐个)FalseFalseFalse

    assert_equalsTrueTrueFalse

    Series.equalsTrueTrueTrue

    mergeTrueTrueTrue

    由于等值性比较方面,None和NaN在各场景下表现不太一致,相对来说None表现的更稳定。

    为了不给自己惹不必要的麻烦和额外的记忆负担。 实践中,建议遵循以下三个原则即可

    在用pandas和numpy处理数据阶段将None,NaN统一处理成NaN,以便支持更多的函数。

    如果要判断Series,numpy.array整体的等值性,用专门的Series.equals,numpy.array函数去处理,不要自己用==判断 *

    如果要将数据导入数据库,将NaN替换成None

    相关文章

      网友评论

        本文标题:pandas写入数据库不支持NaN

        本文链接:https://www.haomeiwen.com/subject/ipepbttx.html