Python でプログラミングする場合、同じ目的を達成するためにさまざまな方法を使用すると興味深い場合があります。魯迅作品の孔毅を思い出します。Kong Yiji は、ウイキョウ豆を表すフェンネルという単語の 4 つの書き方について多くの研究を行いました。私自身を Kong Yiji と比較するつもりはありません。そこで、すべてのプログラマーが楽しめるように、ここで Python フェンネル豆をいくつか集めます。
まずはテスト用のDataFrameを生成する関数を準備します。この DataFrame には、a、b、c という名前の 3 つの列があります。
>>> import numpy as np
>>> import pandas as pd
フェンネルビーン 1: to_numeric()
この関数は、スカラー、リスト、タプル、1 次元配列、または Series 型データを数値型データに変換できます。デフォルトでは、 orタイプは
入力パラメータに基づいて返されます。float64
int64
シーケンスを数値に変換する場合、シーケンス内のデータのデータ型が一致している必要はありません。
>>> s = pd.Series(["1", 2, "3"])
>>> pd.to_numeric(s)
0 1
1 2
2 3
dtype: int64
3 つの列を持つサンプル DataFrame を生成する
>>> df = pd.DataFrame({
... 'a':['1','2','3'],
... 'b':[4,'5.0',6],
... 'c':['7',8,9]})
>>> df.dtypes
a object
b object
c object
dtype: object
すべての列を変換する
>>> df.apply(pd.to_numeric).dtypes
a int64
b float64
c int64
dtype: object
列 a と b のみを変換します
>>> df[["a", "b"]] = df[["a", "b"]].apply(pd.to_numeric)
>>> df.dtypes
a int64
b float64
c object
dtype: object
to_numeric
関数のプロトタイプは ですto_numeric(arg, errors='raise', downcast=None)
。errors
型変換におけるエラー処理を制御できます。詳細についてはドキュメントを参照してください。
同様のタイプの関数にはto_datetime()
、 と がありますto_timedelta()
。
フェンネルビーン 2: astype()
Dataframe と Series のインスタンスには両方とも、型変換に使用できる astype メソッドがあります。
>>> s = pd.Series(["1", 2, "3"])
>>>s.astype(int)
0 1
1 2
2 3
dtype: int64
>>> df = pd.DataFrame({
... 'a':['1','2','3'],
... 'b':[4,'5.0',6],
... 'c':['7',8,9]})
>>> df.astype('int32', errors='ignore').dtypes
a object
b object
c object
dtype: object
>>> df.astype({
'a': 'int32'}).dtypes
a int32
b object
c object
dtype: object
astype
メソッドは定義されていますastype(dtype, copy: bool = True, errors: str = 'raise')
。詳細についてはドキュメントを参照してください。
フェンネルビーンズ 3: infer_objects()
このメソッドの機能は、オブジェクト型列をより適切な型に変換することです。バージョン 0.21.0 で追加されました。例:
>>> df = pd.DataFrame({
"A": ["a", 1, 2, 3],
... "B": ["a", 1, 2.0, 3]})
>>> df.dtypes
A object
B object
dtype: object
>>> df = df.iloc[1:]
>>> df.infer_objects().dtypes
A int64
B float64
dtype: object
フェンネルビーン IV:convert_dtypes()
このメソッドの目的は、列のデータ型をより適切な型に変換することです。バージョン 1.0.0 で追加されました。公式の例:
>>> df = pd.DataFrame(
... {
... "a": pd.Series([1, 2, 3], dtype=np.dtype("int32")),
... "b": pd.Series(["x", "y", "z"], dtype=np.dtype("O")),
... "c": pd.Series([True, False, np.nan], dtype=np.dtype("O")),
... "d": pd.Series(["h", "i", np.nan], dtype=np.dtype("O")),
... "e": pd.Series([10, np.nan, 20], dtype=np.dtype("float")),
... "f": pd.Series([np.nan, 100.5, 200], dtype=np.dtype("float")),
... }
... )
>>> df
a b c d e f
0 1 x True h 10.0 NaN
1 2 y False i NaN 100.5
2 3 z NaN NaN 20.0 200.0
新しい DataFrame を作成します。デフォルトの dtype は次のとおりです。
>>> df.dtypes
a int32
b object
c object
d object
e float64
f float64
dtype: object
型を最適解に変換します。
>>> dfn = df.convert_dtypes()
>>> dfn
a b c d e f
0 1 x True h 10 NaN
1 2 y False i <NA> 100.5
2 3 z <NA> <NA> 20 200.0
>>> dfn.dtypes
a Int32
b string
c boolean
d string
e Int64
f float64
dtype: object
文字列で構成される新しいシリーズを作成します。欠落したデータはnp.nan
で表されます。
>>> s = pd.Series(["a", "b", np.nan])
>>> s
0 a
1 b
2 NaN
dtype: object
dtype を使用してシリーズを取得しますStringDtype
。
>>> s.convert_dtypes()
0 a
1 b
2 <NA>
dtype: string