在Pandas DataFrame中将无效值替换为None
None
在Python的Pandas中,是否有任何方法可以替换值?
您可以使用df.replace('pre','post')
另一个值并将其替换,但是如果要替换为None
值,则无法完成此操作,如果尝试使用该值,则会得到奇怪的结果。
所以这是一个例子:
df = DataFrame(['-',3,2,5,1,-5,-1,'-',9])
df.replace('-', 0)
返回成功的结果。
但,
df.replace('-', None)
返回以下结果:
0
0 - // this isn't replaced
1 3
2 2
3 5
4 1
5 -5
6 -1
7 -1 // this is changed to `-1`...
8 9
为什么会返回如此奇怪的结果?
由于我想将此数据框倒入MySQL数据库,因此我不能将NaN
值放入数据框的任何元素中,而是要放置None
。当然,您可以先更改'-'
为NaN
,然后再转换NaN
为None
,但是我想知道为什么数据框以这种可怕的方式起作用。
已在Python 2.7和OS X 10.8的pandas 0.12.0开发人员上进行了测试。Python是OS X上的预装版本,我通过使用SciPy
Superpack脚本安装了熊猫,以供参考。
-
实际上,在更高版本的熊猫中,这将产生TypeError:
df.replace('-', None) TypeError: If "to_replace" and "value" are both None then regex must be a mapping
您可以通过传递列表或字典来实现:
In [11]: df.replace('-', df.replace(['-'], [None]) # or .replace('-', {0: None}) Out[11]: 0 0 None 1 3 2 2 3 5 4 1 5 -5 6 -1 7 None 8 9
但我建议使用NaN而不是使用None:
In [12]: df.replace('-', np.nan) Out[12]: 0 0 NaN 1 3 2 2 3 5 4 1 5 -5 6 -1 7 NaN 8 9