Pandas df.astype() 関数
df.astype()Pandas で DataFrame または Series のデータ型を変換するための関数です。
データ処理の過程では、データ型の不一致はよくある問題です。例えば、数字が文字列として格納されたり、日付がテキストとして格納されたりします。astype()データを整数、浮動小数点数、文字列、日付などの必要な型に明示的に変換し、データが正しく計算・分析できるようにします。
基本構文とパラメータ
astype()DataFrame のメンバー関数であると同時に Series のメンバー関数でもあり、ドット演算子で.呼び出します。
構文形式
DataFrame.astype(dtype, copy=True, errors='raise') Series.astype(dtype, copy=True, errors='raise')
パラメータの説明
| パラメータ | 型 | 必須かどうか | 説明 | デフォルト値 |
|---|---|---|---|---|
| dtype | Python dtype または numpy dtype | 必須 | 対象データ型。Python 型(例:int、str)、NumPy 型(例:np.int64、np.float32)または Pandas 型(例:'int64'、'float64'、'category')。 |
无 |
| copy | bool | オプション | もしTrueの場合、常に新しいオブジェクトを返します。もしFalseの場合、可能な限り元のオブジェクト上で変更します。 |
True |
| errors | str | オプション | エラー処理を制御します。'raise'変換失敗時に例外を送出することを示します。'ignore'変換失敗時に元のデータを返し、例外を送出しないことを示します。 |
'raise' |
戻り値の説明
- 指定されたすべての列のデータ型が対象の型に変換された、新しい DataFrame または Series を返します。
例
一連の例を通して、astype()の使い方をしっかりマスターしましょう。
例1:単一列のデータ型を変換する
Series または DataFrame の特定の列を指定した型に変換します。
例
import pandas as pd
# DataFrame を作成する。数値が文字列として格納されている
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': ['25', '30', '35', '28'], # 文字列として格納
'薪资': ['5000', '6000', '5500', '7000'] # 文字列として格納
}
df = pd.DataFrame(data)
print("原始数据类型:")
print(df.dtypes)
print("=" * 50)
# 「年龄」列を整数型に変換する
df['年龄'] = df['年龄'].astype(int)
print(年齢列を変換した後のデータ型:)
print(df.dtypes)
print("=" * 50)
# 「薪资」列を浮動小数点型に変換する
df['薪资'] = df['薪资'].astype(float)
print(給与列を変換した後のデータ型:)
print(df.dtypes)
print("=" * 50)
print("変換後のデータ:")
print(df)
# DataFrame を作成する。数値が文字列として格納されている
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': ['25', '30', '35', '28'], # 文字列として格納
'薪资': ['5000', '6000', '5500', '7000'] # 文字列として格納
}
df = pd.DataFrame(data)
print("原始数据类型:")
print(df.dtypes)
print("=" * 50)
# 「年龄」列を整数型に変換する
df['年龄'] = df['年龄'].astype(int)
print(年齢列を変換した後のデータ型:)
print(df.dtypes)
print("=" * 50)
# 「薪资」列を浮動小数点型に変換する
df['薪资'] = df['薪资'].astype(float)
print(給与列を変換した後のデータ型:)
print(df.dtypes)
print("=" * 50)
print("変換後のデータ:")
print(df)
想定される実行結果:
原始数据类型:
姓名 object
年龄 object # 字符串类型
薪资 object # 字符串类型
==================================================
转换年龄列后的数据类型:
姓名 object
年龄 int64 # 整数类型
薪资 object
==================================================
转换薪资列后的数据类型:
姓名 object
年龄 int64
薪资 float64 # 浮点数类型
==================================================
转换后的数据:
姓名 年龄 薪资
0 张三 25 5000.0
1 李四 30 6000.0
2 王五 35 5500.0
3 赵六 28 7000.0
コードの解説:
- 元のデータでは、年齢と給与はどちらも文字列型(
object)。 - を使用して
df['列名'].astype(int)文字列を整数に変換しています。 - 変換後は合計や平均などの数値計算が可能になります。
例2:DataFrame 全体のデータ型を変換する
DataFrame 全体に対して一度にデータ型を指定できます。
例
import pandas as pd
# DataFrame を作成する
data = {
'A': [1, 2, 3, 4],
'B': [1.5, 2.5, 3.5, 4.5],
'C': ['a', 'b', 'c', 'd']
}
df = pd.DataFrame(data)
print("原始数据类型:")
print(df.dtypes)
print("=" * 50)
# A 列を float64 に、B 列を int64 に変換する
df_converted = df.astype({'A': 'float64', 'B': 'int64'})
print("変換後のデータ型:")
print(df_converted.dtypes)
print("=" * 50)
print("変換後のデータ:")
print(df_converted)
# DataFrame を作成する
data = {
'A': [1, 2, 3, 4],
'B': [1.5, 2.5, 3.5, 4.5],
'C': ['a', 'b', 'c', 'd']
}
df = pd.DataFrame(data)
print("原始数据类型:")
print(df.dtypes)
print("=" * 50)
# A 列を float64 に、B 列を int64 に変換する
df_converted = df.astype({'A': 'float64', 'B': 'int64'})
print("変換後のデータ型:")
print(df_converted.dtypes)
print("=" * 50)
print("変換後のデータ:")
print(df_converted)
想定される実行結果:
原始数据类型:
A int64
B float64
C object
==================================================
转换后的数据类型:
A float64
B int64 # 小数部分被截断
C object
==================================================
转换后的数据:
A B C
0 1.0 2 a
1 2.0 2 b
2 3.0 3 c
3 4.0 4 d
コードの解説:
- 辞書を使用して
{'列名': '型'}複数列の変換型を一度に指定できます。 - B 列の浮動小数点数を整数に変換すると、小数部分は切り捨てられます(2.5 は 2 になります)。
例3:カテゴリ型データに変換する
カテゴリ型データ(category)はメモリを節約でき、取り得る値が限られている列に特に適しています。
例
import pandas as pd
# 重複する値を多数含む DataFrame を作成する
data = {
'城市': ['北京', '上海', '广州', '深圳', '北京', '上海', '广州', '深圳'] * 1000,
'编号': range(8000)
}
df = pd.DataFrame(data)
print("原始数据类型:")
print(df.dtypes)
print(f"内存使用: {df.memory_usage(deep=True).sum() / 1024:.2f} KB")
print("=" * 50)
# 「城市」列をカテゴリ型に変換する
df['城市'] = df['城市'].astype('category')
print("変換後のデータ型:")
print(df.dtypes)
print(f"内存使用: {df.memory_usage(deep=True).sum() / 1024:.2f} KB")
# 重複する値を多数含む DataFrame を作成する
data = {
'城市': ['北京', '上海', '广州', '深圳', '北京', '上海', '广州', '深圳'] * 1000,
'编号': range(8000)
}
df = pd.DataFrame(data)
print("原始数据类型:")
print(df.dtypes)
print(f"内存使用: {df.memory_usage(deep=True).sum() / 1024:.2f} KB")
print("=" * 50)
# 「城市」列をカテゴリ型に変換する
df['城市'] = df['城市'].astype('category')
print("変換後のデータ型:")
print(df.dtypes)
print(f"内存使用: {df.memory_usage(deep=True).sum() / 1024:.2f} KB")
想定される実行結果:
原始数据类型: 城市 object 编号 int64 内存使用: ~456 KB ================================================== 转换后的数据类型: 城市 category 编号 int64 内存使用: ~120 KB # 内存使用大幅减少
コードの解説:
- カテゴリ型データは、一意の値ごとに整数の識別子を割り当てるため、完全な文字列を保存するよりもメモリを大幅に節約できます。
- 元のデータは8000行でメモリ使用量が約456KB、変換後は約120KBとなり、約75%のメモリを節約できます。
- この方法は、取り得る値が少ないカテゴリ変数に特に適しています。
例4:日時型に変換する
文字列を日時型に変換して、日付関連の操作を行えるようにします。
例
import pandas as pd
# 日付文字列を含む DataFrame を作成する
data = {
'日期': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04'],
'销量': [100, 150, 120, 180]
}
df = pd.DataFrame(data)
print("原始数据类型:")
print(df.dtypes)
print("=" * 50)
# 「日期」列を日時型に変換する
df['日期'] = pd.to_datetime(df['日期'])
print("変換後のデータ型:")
print(df.dtypes)
print("=" * 50)
print("変換後のデータ:")
print(df)
# これで日付関連の操作が可能になる
print("n提取月份:")
print(df['日期'].dt.month)
# 日付文字列を含む DataFrame を作成する
data = {
'日期': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04'],
'销量': [100, 150, 120, 180]
}
df = pd.DataFrame(data)
print("原始数据类型:")
print(df.dtypes)
print("=" * 50)
# 「日期」列を日時型に変換する
df['日期'] = pd.to_datetime(df['日期'])
print("変換後のデータ型:")
print(df.dtypes)
print("=" * 50)
print("変換後のデータ:")
print(df)
# これで日付関連の操作が可能になる
print("n提取月份:")
print(df['日期'].dt.month)
想定される実行結果:
原始数据类型:
日期 object # 字符串类型
销量 int64
==================================================
转换后的数据类型:
日期 datetime64[ns] # 日期时间类型
销量 int64
==================================================
转换后的数据:
日期 销量
0 2024-01-01 100
1 2024-01-02 150
2 2024-01-03 120
3 2024-01-04 180
提取月份:
0 1
1 1
2 1
3 1
Name: 日期, dtype: int64
コードの解説:
- を使用して
pd.to_datetime()文字列を日時型に変換します。 - 変換後は
.dtアクセサを使用して、月の抽出や曜日などの日付操作ができます。 - 注意:
astype('datetime64[ns]')も使用できますが、pd.to_datetime()の方がより強力で柔軟です。
例5:変換エラーの処理
を使用すると、errors='ignore'変換失敗の場合を処理できます。
例
import pandas as pd
# 整数に変換できない値を含む Series を作成する
s = pd.Series(['1', '2', 'hello', '4', 'world'])
print("原始数据:")
print(s)
print("=" * 50)
# 変換を試みる。errors='raise'(デフォルト)の場合は例外が発生する
try:
s_converted = s.astype(int)
except ValueError as e:
print(f"转换失败: {e}")
print("=" * 50)
# errors='ignore' を使用すると、変換失敗時に元のデータを返す
s_converted = s.astype(int, errors='ignore')
print(errors='ignore' を使用して変換したデータ:)
print(s_converted)
print("=" * 50)
# errors='coerce' を使用すると、変換失敗時に NaN で埋める
s_converted2 = s.astype(float, errors='coerce')
print(errors='coerce' を使用して変換したデータ:)
print(s_converted2)
# 整数に変換できない値を含む Series を作成する
s = pd.Series(['1', '2', 'hello', '4', 'world'])
print("原始数据:")
print(s)
print("=" * 50)
# 変換を試みる。errors='raise'(デフォルト)の場合は例外が発生する
try:
s_converted = s.astype(int)
except ValueError as e:
print(f"转换失败: {e}")
print("=" * 50)
# errors='ignore' を使用すると、変換失敗時に元のデータを返す
s_converted = s.astype(int, errors='ignore')
print(errors='ignore' を使用して変換したデータ:)
print(s_converted)
print("=" * 50)
# errors='coerce' を使用すると、変換失敗時に NaN で埋める
s_converted2 = s.astype(float, errors='coerce')
print(errors='coerce' を使用して変換したデータ:)
print(s_converted2)
想定される実行結果:
原始数据: 0 1 1 2 2 hello # 无法转换为整数 3 4 4 world # 无法转换为整数 ================================================== 转换失败: invalid literal for int() with base 10: 'hello' ================================================== 使用 errors='ignore' 转换后的数据: 0 1 1 2 2 hello # 保持原值 3 4 4 world # 保持原值 ================================================== 使用 errors='coerce' 转换后的数据: 0 1.0 1 2.0 2 NaN # 无法转换,设为 NaN 3 4.0 4 NaN # 无法转换,设为 NaN
コードの解説:
- 文字列に数値へ変換できない値が含まれている場合、デフォルトでは
ValueError例外が送出されます。 errors='ignore'は元のデータを変更せずに保持します。errors='coerce'は変換できない値をNaNに設定します。これはダーティデータを処理する一般的な方法です。
例6:ブール型に変換する
データをブール型に変換します。条件フィルタリングや論理演算でよく使われます。
例
import pandas as pd
# 0 と 1 を含む DataFrame を作成する
data = {
'会員かどうか': [0, 1, 1, 0, 1],
'アクティブかどうか': ['はい', 'いいえ', 'はい', 'はい', 'いいえ']
}
df = pd.DataFrame(data)
print("元のデータ:")
print(df)
print("元のデータ型:")
print(df.dtypes)
print("=" * 50)
# 0/1 をブール型に変換する
df['会員かどうか'] = df['会員かどうか'].astype(bool)
print("会員かどうか列を変換した後のデータ型:")
print(df.dtypes)
print(df)
print("=" * 50)
# 「はい」/「いいえ」をブール型に変換する
df['アクティブかどうか'] = df['アクティブかどうか'].map({'はい': True, 'いいえ': False})
print("アクティブかどうか列を変換した後のデータ:")
print(df)
print(df.dtypes)
# 0 と 1 を含む DataFrame を作成する
data = {
'会員かどうか': [0, 1, 1, 0, 1],
'アクティブかどうか': ['はい', 'いいえ', 'はい', 'はい', 'いいえ']
}
df = pd.DataFrame(data)
print("元のデータ:")
print(df)
print("元のデータ型:")
print(df.dtypes)
print("=" * 50)
# 0/1 をブール型に変換する
df['会員かどうか'] = df['会員かどうか'].astype(bool)
print("会員かどうか列を変換した後のデータ型:")
print(df.dtypes)
print(df)
print("=" * 50)
# 「はい」/「いいえ」をブール型に変換する
df['アクティブかどうか'] = df['アクティブかどうか'].map({'はい': True, 'いいえ': False})
print("アクティブかどうか列を変換した後のデータ:")
print(df)
print(df.dtypes)
期待される実行結果:
原始数据: 是否会员 是否激活 0 0 是 1 1 否 2 1 是 3 0 是 4 1 否 ================================================== 转换是否会员列后的数据类型: 是否会员 bool 是否激活 object ================================================== 转换是否激活列后的数据: 是否会员 是否激活 0 True True 1 True False 2 True True 3 False True 4 True False
コード解析:
- 0 の変換結果は
False、1 の変換結果はTrue。 - 「はい」/「いいえ」のような文字列には、
map()を使用して変換します。 - 変換後は、ブールインデックスを使用して高速にフィルタリングできます。
注意事項
astype()デフォルトでは新しいオブジェクトが返され、元のデータは変更されません。元のデータを変更したい場合は、copy=Falseパラメータを使用できますが、元のデータに影響を与える可能性があります。- 浮動小数点数を整数に変換する場合、小数部分は切り捨てられ、四捨五入はされません。
- 文字列を数値に変換する場合、文字列が有効な数値形式であることを確認してください。そうでない場合は例外がスローされます。
- 使用するのは
errors='coerce'で、汚れたデータを処理する推奨方法です。無効な値をNaNに変換してから、fillna()で埋めます。 - 重複する値が多い列では、カテゴリ型に変換するとメモリ使用量を大幅に削減できます。
その他の拡張