在 Pandas DataFrame 中用 None 替换无效值

新手上路,请多包涵

在 Python 的 Pandas 中,是否有任何方法可以用 None 替换值?

您可以使用 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 放入。 Surely, you can first change '-' to NaN and then convert NaN to None , but I want to know why the dataframe acts in如此可怕的方式。

在 Python 2.7 和 OS X 10.8 上的 pandas 0.12.0 dev 上测试。 Python 是 OS X 上的预装版本,我使用 SciPy Superpack 脚本安装了 pandas,供您参考。

原文由 Blaszard 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

实际上在更高版本的 pandas 中,这将给出一个 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

原文由 Andy Hayden 发布,翻译遵循 CC BY-SA 3.0 许可协议

我更喜欢使用 replacedict --- 的解决方案,因为它简单优雅:

 df.replace({'-': None})

您还可以有更多的替代品:

 df.replace({'-': None, 'None': None})

甚至对于更大的替换,总是很明显和清楚什么被什么替换了——在我看来,这对于长列表来说更难。

原文由 Michael Dorner 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题