Answers:
@bogatron正确,您可以使用where
,值得注意的是您可以在熊猫本机执行此操作:
df1 = df.where(pd.notnull(df), None)
注意:这会将所有列的dtype更改为object
。
例:
In [1]: df = pd.DataFrame([1, np.nan])
In [2]: df
Out[2]:
0
0 1
1 NaN
In [3]: df1 = df.where(pd.notnull(df), None)
In [4]: df1
Out[4]:
0
0 1
1 None
注意:您不能执行的操作dtype
是使用astype
,然后使用DataFrame fillna
方法来重铸DataFrame 以允许所有数据类型,请执行以下操作:
df1 = df.astype(object).replace(np.nan, 'None')
遗憾的是这个没有,也没有使用replace
,用作品None
看这个(关闭)的问题。
顺便说一句,值得注意的是,对于大多数用例,您不需要将NaN替换为None,请参阅有关熊猫中NaN和None之间的区别的问题。
但是,在这种特定情况下,您似乎可以这样做(至少在回答此问题时)。
np.nan
被转换为字符串"nan"
dtype
存在的那些列object
并对其进行处理,并根据需要以不同的方式处理其他类型是有意义的。理想情况下,fillna(None)
会很棒。
df = df.replace({np.nan: None})
这个Github问题归功于这个家伙。
df.replace({np.nan: None})
用作临时对象的最佳答案
您可以在numpy数组中替换nan
为None
:
>>> x = np.array([1, np.nan, 3])
>>> y = np.where(np.isnan(x), None, x)
>>> print y
[1.0 None 3.0]
>>> print type(y[1])
<type 'NoneType'>
dtype
,x.dtype
就是dtype('float64')
,虽然y.dtype
是dtype('object')
。
只是@Andy Hayden的答案的补充:
由于DataFrame.mask
是的相对孪生子DataFrame.where
,因此它们具有完全相同的签名,但含义相反:
DataFrame.where
对于替换条件为False的值很有用。 DataFrame.mask
用于替换条件为True的值。所以在这个问题上,使用df.mask(df.isna(), other=None, inplace=True)
可能会更直观。
另外除了:更换倍数和转换从柱背面的类型时要小心对象到浮动。如果您想确定自己None
的不会退回到np.NaN
's',请使用@ andy-hayden的建议pd.where
。替换仍然会出错的说明:
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: df = pd.DataFrame({"a": [1, np.NAN, np.inf]})
In [4]: df
Out[4]:
a
0 1.0
1 NaN
2 inf
In [5]: df.replace({np.NAN: None})
Out[5]:
a
0 1
1 None
2 inf
In [6]: df.replace({np.NAN: None, np.inf: None})
Out[6]:
a
0 1.0
1 NaN
2 NaN
In [7]: df.where((pd.notnull(df)), None).replace({np.inf: None})
Out[7]:
a
0 1.0
1 NaN
2 NaN
.replace({np.nan: None})
replace({np.nan: None})
。添加我的评论是为了指出替换时的潜在陷阱np.nan
。以上肯定使我跳了一下!
None
,NULL
而不是nan
?