LoginSignup
0
0

pandas: dtypeが`object`のSeriesで`replace()`を実行すると、`pandas.NA`,`numpy.na`, `None`を同じ値だとみなして置換する

Last updated at Posted at 2024-04-13

環境

  • Python 3.12.1
  • pandas 2.2.2

はじめに

pandas.Seriesにはpandas.NA, numpy.nan, Noneが含まれています。dtypeはobjectです。
どの要素にpandas.NAが含まれているかを調べたいです。

Series.to_csv()で出力すると、pandas.NA,numpy.na, Noneはすべて空文字で出力されて、区別できません。したがって、pandas.NA"???"などの目立つ文字列にreplace()で置換してから、Series.to_csvで出力してみました。しかしCSVの中身は、pandas.NAだけでなくnumpy.naNone"???"に変換されていました。

Series.replaceの動作を確認する

pandas.Series.replaceの動作を確認しました。

In [132]: import pandas as pd
In [132]: import numpy as np

In [133]: s = pd.Series(["a", pd.NA, np.nan, None], dtype="object")

In [121]: s.replace({pd.NA: "???"})
Out[121]:
0      a
1    ???
2    ???
3    ???
dtype: object

In [124]: s.replace({np.nan: "???"})
Out[124]:
0      a
1    ???
2    ???
3    ???
dtype: object

In [122]: s.replace({None: "???"})
Out[122]:
0      a
1    ???
2    ???
3    ???
dtype: object

replace()では、pandas.NA,numpy.na, Noneは同じ値として、置換されるようです。

補足: dtypeがstringFloat64,Int64ならば、pandas.NAnumpy.nanNoneに置換できない

dtypeがstringFloat64,Int64などでは、pandas.NAnumpy.nanNoneに置換できません。dtypeがstringFloat64,Int64Seriesでは、欠損値はpandas.NAに変換されます。

In [135]: s2 = pd.Series(["a",pd.NA], dtype="string")

In [136]: s2.replace({pd.NA:np.nan})
Out[136]:
0       a
1    <NA>
dtype: string

In [137]: s2.replace({pd.NA: None})
Out[137]:
0       a
1    None
dtype: object

replace()に限らず、直接設定するときも同様です。

In [140]: s2[1]=np.nan

In [141]: s2
Out[141]:
0       a
1    <NA>
dtype: string

In [142]: s2[1]=None

In [143]: s2
Out[143]:
0       a
1    <NA>
dtype: string

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0