Pandas: nan转为None

8

pandas.DataFrame.to_dict函数将nan转换成nan,将null转换成None。有时候,这种方式并不是最优解,就像在Python comparison ignoring nan中所解释的那样。

是否有一种方法可以将所有的nan都转换成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'}}

I want

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

改为使用。

2个回答

10
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'}}

我要注意的是,这个做法实现了相同的功能,即将每一列转换为对象类型,只不过它分两步完成。 - cs95
@cᴏʟᴅsᴘᴇᴇᴅ 没错,你说得对,几乎一样 :-) - BENY
只是提一下,因为 OP 似乎认为这将数据转换为字符串(实际上并不是这样!)。 - cs95
@cᴏʟᴅsᴘᴇᴇᴅ:这与您建议的不同,因为它适用于外部生成的“DataFrame”,而不是从头开始创建一个通用DF。 - sds
@sds 我知道它的作用。我在之前的评论中想表达的是最终结果是相同的(一个通用数据框),而不是像你最初猜测的那样是一个字符串数据框。我只是在纠正你的误解,没有别的意思。 - cs95

3

不要轻易将DataFrame初始化为一个对象(风险自负...):

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

      a     b
0     1  None
1  None   foo

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


这是作弊。我在“DataFrame”中有数字列,将其转换为字符串会丢失信息。 - sds
@sds 不,这里没有进行任何字符串转换。 - cs95
每一列都被初始化为Python对象的列。Pandas不再对其内容做出假设,并退回到较慢的操作方法。 - cs95
2
我有一种感觉,df = pd.DataFrame({"a":[1,None],"b":[None,"foo"]}) 是一个最小可复现示例,用于提供一个起始数据框以进行操作。实际上,如果你已经完成了一系列的处理,将整个结果数据框转换为 object 再进行 to_dict() 操作是否有意义呢? - roganjosh
1
@sds object != str - juanpa.arrivillaga
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接