Pandas df.astype() 関数

Pandas のよく使う関数


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)

想定される実行結果:

原始数据类型:
姓名     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

コードの解説:

  1. 元のデータでは、年齢と給与はどちらも文字列型(object)。
  2. を使用してdf['列名'].astype(int)文字列を整数に変換しています。
  3. 変換後は合計や平均などの数値計算が可能になります。

例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)

想定される実行結果:

原始数据类型:
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")

想定される実行結果:

原始数据类型:
城市    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)

想定される実行結果:

原始数据类型:
日期    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)

想定される実行結果:

原始数据:
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       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()で埋めます。
  • 重複する値が多い列では、カテゴリ型に変換するとメモリ使用量を大幅に削減できます。

Pandas よく使う関数

その他の拡張