在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脚本安装了熊猫,以供参考。


蝴蝶不菲
浏览 607回答 3
3回答

料青山看我应如是

实际上,在更高版本的熊猫中,这将产生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]:      00  None1     32     23     54     15    -56    -17  None8     9但我建议使用NaN而不是使用None:In [12]: df.replace('-', np.nan)Out[12]:     00  NaN1    32    23    54    15   -56   -17  NaN8    9

湖上湖

我更喜欢使用replace带有a的解决方案,dict因为它既简单又优雅:df.replace({'-': None})您还可以有更多替代品:df.replace({'-': None, 'None': None})即使是较大的替换,也总是显而易见的,什么替换了-我认为对于长列表来说,这要困难得多。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python