【问题标题】:Pandas: nan->None熊猫:nan->无
【发布时间】:2018-07-05 07:27:36
【问题描述】:

pandas.DataFrame.to_dictnan 转换为 nannull 转换为 None。正如Python comparison ignoring nan 中所解释的,这有时不是最理想的。

有没有办法将所有nans 转换为None? (在pandas 或更高版本的 Python 中)

例如,

>>> df = pd.DataFrame({"a":[1,None],"b":[None,"foo"]})
>>> df
     a     b
0  1.0  None
1  NaN   foo
>>> df.to_dict()
{'a': {0: 1.0, 1: nan}, 'b': {0: None, 1: 'foo'}}

我想要

{'a': {0: 1.0, 1: None}, 'b': {0: None, 1: 'foo'}}

改为。

【问题讨论】:

    标签: python python-2.7 pandas nan


    【解决方案1】:
    import pandas as pd
    
    df = pd.DataFrame({"a":[1,None],"b":[None,"foo"]})
    df.where((pd.notnull(df)), None)
    Out[850]: 
          a     b
    0     1  None
    1  None   foo
    df.where((pd.notnull(df)), None).to_dict()
    Out[851]: {'a': {0: 1.0, 1: None}, 'b': {0: None, 1: 'foo'}}
    

    【讨论】:

    • 我会注意到它做同样的事情,将每一列转换为对象类型,只是它分两步完成。
    • @cᴏʟᴅsᴘᴇᴇᴅ 是的,你是对的,几乎一样:-)
    • 只是提到,因为 OP 似乎认为这是将数据转换为字符串(事实并非如此!)。
    • @cᴏʟᴅsᴘᴇᴇᴅ:这与您的建议不同,因为它适用于外部生成的 DataFrame,而不是从头开始创建通用 DF。
    • @sds 我知道它的作用。我在之前的评论中的观点是,最终结果是相同的(通用数据框),而不是您最初推测的字符串数据框。我只是在解决您的误解,仅此而已。
    【解决方案2】:

    初始化为对象 DataFrame(后果自负...):

    df = pd.DataFrame({"a":[1,None],"b":[None,"foo"]}, dtype=object)    
    df
    
          a     b
    0     1  None
    1  None   foo
    

    在第一列中,pandas 尝试推断 dtype,并猜测浮点数。您可以通过强制它保持object 来防止这种情况发生,从而完全抑制任何类型的转换。

    【讨论】:

    • 这是作弊。我在DataFrame 中有 numeric 列,将其转换为字符串会丢失信息。
    • @sds 不,没有发生字符串转换。
    • 每一列都被初始化为python对象的列。 Pandas 不再对其内容进行假设,而是采用缓慢的操作方法。
    • 我有一种感觉,虽然df = pd.DataFrame({"a":[1,None],"b":[None,"foo"]}) 是一个 MCVE,可以让首发 DF 玩。实际上,如果您处于流程链的末端,那么在 to_dict() 之前将整个生成的 DF 转换为 object 是否有意义?
    • @sds object != str
    猜你喜欢
    • 2021-12-15
    • 2014-01-29
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 2018-03-27
    • 2019-02-13
    相关资源
    最近更新 更多