1. ホーム
  2. python

[解決済み] Pandas DataFrameの無効な値をNoneに置き換える。

2022-12-30 01:10:28

質問

で値を置き換える方法はありますか? 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 . 確かに、まず '-'NaN に変換し、さらに NaNNone に変更する必要がありますが、なぜデータフレームがこのようなひどい動作をするのか知りたいのです。

Python 2.7とOS X 10.8上のpandas 0.12.0 devでテストしています。Pythonは PythonはOS Xにプリインストールされているバージョンで、pandasはSciPy Superpackスクリプトでインストールしました。

どのように解決するのですか?

実はこれ、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

しかし、NoneよりもNaNを使うことをお勧めします。

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