LoginSignup
0
0

pandas2.2: dtypeが`string`の`Series`に対して`map()`を実行すると、dtypeが`object`に変わる

Last updated at Posted at 2024-04-12

環境

  • Python 3.12.1
  • panda 2.2.2

はじめに

pandas.Sereis.mapを使ったら、pandas.NAnumpy.nanに変換されるときがありました。
実際に試して、どう変換されるかを確認しました。

結果

pd.NAを含む場合

dtypeがInt64

In [51]: s2 = pd.Series([1, pd.NA],dtype="Int64")

In [52]: s2
Out[52]:
0       1
1    <NA>
dtype: Int64

In [53]: s2.map(lambda e: e)
Out[53]:
0    1.0
1    NaN
dtype: float64

pd.NAnp.nanに変わりました。またdtypeがInt64からfloat64に変わりました。int64でなくfloat64に変わったのは、np.nanの型がfloatだからでしょう。

dtypeがstring

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

In [55]: s3
Out[55]:
0       a
1    <NA>
dtype: string

In [56]: s3.map(lambda e: e)
Out[56]:
0       a
1    <NA>
dtype: object

pd.NAはそのままの値でした。しかし、dtypestringからobjectに変わりました。

pd.NAを含まない場合

dtypeがInt64

In [60]: s4 = pd.Series([1,2],dtype="Int64")

In [62]: s4
Out[62]:
0    1
1    2
dtype: Int64

In [61]: s4.map(lambda e: e)
Out[61]:
0    1
1    2
dtype: int64

dtypeがInt64からint64に変わりました。

dtypeがstring

In [64]: s5 = pd.Series(["a","b"],dtype="string")

In [65]: s5
Out[65]:
0    a
1    b
dtype: string

In [66]: s5.map(lambda e: e)
Out[66]:
0    a
1    b
dtype: object

dtypeがstringからobjectに変わりました。

分かったこと

Series.mapに挙動について分かったことです。

  • pandas独自のdtypeがnumpy用のdtypeに変換されます。たとえばInt64int64に、stringobjectに変換されます。
  • dtypeがfloat64int64の列はpd.NAを含められないので、pd.NAnp.nanに変換されます。ただしnp.nanはfloat型なので、pd.NAを含むdtypeがInt64の列はfloat64に変換されます。
  • dtypeがobjectの列はpd.NAを含むことができるので、dtypeがstringの列に含まれるpd.NAnp.nanに変換されません。

補足

pandas 2.1とpandas2.2で挙動が異なるようです。今後のpandasバージョンアップで、挙動が変わるかもしれません。

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