101

NonePandas in Pythonで値を置き換える方法はありますか?

値を別の値に置き換えたり、使用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 dev でテスト済み。Python は OS X にプリインストールされているバージョンであり、参考までに SciPy Superpack スクリプトを使用して pandas をインストールしました。

4

9 に答える 9

125

実際、パンダのそれ以降のバージョンでは、これにより 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
于 2013-06-13T21:29:01.457 に答える
29

シンプルでエレガントなため、replacea を使用したソリューションを好みます。dict

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

より多くの置換を行うこともできます:

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

そして、より大きな置換の場合でも、何を何に置換するかは常に明白で明確です。私の意見では、これは長いリストの場合ははるかに困難です。

于 2018-03-21T12:31:05.530 に答える