パンダでタイプを変換するには、主に3つのオプションがあります。
to_numeric()
-非数値型(文字列など)を適切な数値型に安全に変換する機能を提供します。(も参照してくださいto_datetime()
とto_timedelta()
。)
astype()
-(ほぼ)任意のタイプを(ほぼ)他のタイプに変換します(必ずしもそうする必要がない場合でも)。また、カテゴリタイプに変換することもできます(非常に便利です)。
infer_objects()
-可能であれば、Pythonオブジェクトを保持するオブジェクト列をパンダ型に変換するユーティリティメソッド。
これらの各方法の詳細な説明と使用方法については、以下をお読みください。
1。 to_numeric()
DataFrameの1つ以上の列を数値に変換する最良の方法は、を使用することpandas.to_numeric()
です。
この関数は、非数値オブジェクト(文字列など)を必要に応じて整数または浮動小数点数に変更しようとします。
基本的な使い方
への入力to_numeric()
は、SeriesまたはDataFrameの単一の列です。
>>> s = pd.Series(["8", 6, "7.5", 3, "0.9"]) # mixed string and numeric values
>>> s
0 8
1 6
2 7.5
3 3
4 0.9
dtype: object
>>> pd.to_numeric(s) # convert everything to float values
0 8.0
1 6.0
2 7.5
3 3.0
4 0.9
dtype: float64
ご覧のとおり、新しいシリーズが返されます。引き続き使用するには、この出力を変数または列名に割り当てることを忘れないでください。
# convert Series
my_series = pd.to_numeric(my_series)
# convert column "a" of a DataFrame
df["a"] = pd.to_numeric(df["a"])
次のapply()
メソッドを使用して、DataFrameの複数の列を変換することもできます。
# convert all columns of DataFrame
df = df.apply(pd.to_numeric) # convert all columns of DataFrame
# convert just columns "a" and "b"
df[["a", "b"]] = df[["a", "b"]].apply(pd.to_numeric)
値をすべて変換できる限り、おそらくそれで十分です。
エラー処理
しかし、一部の値を数値型に変換できない場合はどうなりますか?
to_numeric()
また、errors
数値以外の値を強制するキーワード引数を取るか、NaN
これらの値を含む列を単に無視します。
s
オブジェクトdtypeを持つ一連の文字列を使用した例を次に示します。
>>> s = pd.Series(['1', '2', '4.7', 'pandas', '10'])
>>> s
0 1
1 2
2 4.7
3 pandas
4 10
dtype: object
デフォルトの動作では、値を変換できない場合に発生します。この場合、文字列「パンダ」に対応できません。
>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')
ValueError: Unable to parse string
失敗するのではなく、「パンダ」を欠落/不正な数値と見なしたい場合があります。キーワード引数NaN
を使用して、無効な値を次のように強制できerrors
ます。
>>> pd.to_numeric(s, errors='coerce')
0 1.0
1 2.0
2 4.7
3 NaN
4 10.0
dtype: float64
の3番目のオプションerrors
は、無効な値が検出された場合に操作を無視することです。
>>> pd.to_numeric(s, errors='ignore')
# the original Series is returned untouched
この最後のオプションは、DataFrame全体を変換したいが、確実に数値型に変換できる列がわからない場合に特に便利です。その場合は次のように書いてください:
df.apply(pd.to_numeric, errors='ignore')
関数は、DataFrameの各列に適用されます。数値型に変換できる列は変換されますが、変換できない列(数字以外の文字列や日付を含む列など)はそのままになります。
ダウンキャスト
デフォルトでは、with with to_numeric()
はa int64
またはfloat64
dtype(またはプラットフォーム固有の整数幅)を提供します。
通常はこれで十分ですが、メモリを節約してfloat32
、やなどのよりコンパクトなdtypeを使用したい場合はどうすればよいint8
でしょうか。
to_numeric()
'integer'、 'signed'、 'unsigned'、 'float'のいずれかにダウンキャストするオプションを提供します。一連s
の単純な整数型の例を次に示します。
>>> s = pd.Series([1, 2, -7])
>>> s
0 1
1 2
2 -7
dtype: int64
「整数」へのダウンキャストでは、値を保持できる最小の整数を使用します。
>>> pd.to_numeric(s, downcast='integer')
0 1
1 2
2 -7
dtype: int8
'float'へのダウンキャストも同様に、通常よりも小さい浮動小数点型を選択します。
>>> pd.to_numeric(s, downcast='float')
0 1.0
1 2.0
2 -7.0
dtype: float32
2。 astype()
このastype()
メソッドを使用すると、DataFrameまたはSeriesに必要なdtypeを明示的に指定できます。1つのタイプから別のタイプに試してみることができるという点で、非常に用途が広いです。
基本的な使い方
タイプを選択するだけです。NumPydtype(例:)np.int16
、一部のPythonタイプ(例:bool)、またはパンダ固有のタイプ(カテゴリカルdtypeなど)を使用できます。
変換するオブジェクトのメソッドを呼び出すastype()
と、変換が試行されます。
# convert all DataFrame columns to the int64 dtype
df = df.astype(int)
# convert column "a" to int64 dtype and "b" to complex type
df = df.astype({"a": int, "b": complex})
# convert Series to float16 type
s = s.astype(np.float16)
# convert Series to Python strings
s = s.astype(str)
# convert Series to categorical type - see docs for more details
s = s.astype('category')
「試行」と言ったことに注意してくださいastype()
。SeriesまたはDataFrameの値を変換する方法がわからない場合は、エラーが発生します。たとえば、NaN
またはinf
値がある場合、それを整数に変換しようとするとエラーが発生します。
Pandas 0.20.0以降、このエラーはを渡すことで抑制できますerrors='ignore'
。元のオブジェクトはそのままの状態で返されます。
注意してください
astype()
強力ですが、値が「誤って」変換されることがあります。例えば:
>>> s = pd.Series([1, 2, -7])
>>> s
0 1
1 2
2 -7
dtype: int64
これらは小さな整数なので、メモリを節約するために、符号なし8ビット型に変換してみませんか?
>>> s.astype(np.uint8)
0 1
1 2
2 249
dtype: uint8
変換が働いたが、-7 249になるようにラウンド包まれた(すなわち2 8 - 7)!
pd.to_numeric(s, downcast='unsigned')
代わりにを使用してダウンキャストしようとすると、このエラーを防ぐのに役立ちます。
3。 infer_objects()
パンダのバージョン0.21.0ではinfer_objects()
、オブジェクトデータ型を持つDataFrameの列をより具体的な型に変換するメソッド(ソフト変換)が導入されました。
たとえば、オブジェクト型の2つの列を持つDataFrameは次のとおりです。1つは実際の整数を保持し、もう1つは整数を表す文字列を保持します。
>>> df = pd.DataFrame({'a': [7, 1, 5], 'b': ['3','2','1']}, dtype='object')
>>> df.dtypes
a object
b object
dtype: object
を使用するとinfer_objects()
、列「a」のタイプをint64に変更できます。
>>> df = df.infer_objects()
>>> df.dtypes
a int64
b object
dtype: object
列 'b'は、値が整数ではなく文字列であるため、そのままにされています。両方の列を整数型に強制的に変換したい場合は、df.astype(int)
代わりに使用できます。