【Python】Pandasで属性を変更する方法:実践的な手順とポイント

Pandasは、Pythonのデータ解析ライブラリの中でも特に有名で、データの整形や前処理に利用されます。その中でも、データフレーム(DataFrame)という機能は、表形式のデータを扱う上で非常に便利です。この記事では、Pandasのデータフレームの属性変更について詳しく解説します。

はじめに

データフレームは、横方向に複数の列(カラム)と縦方向に複数の行(インデックス)を持ち、表形式のデータを扱うことができます。Pandasを使えば、このデータフレームの属性を変更することができます。ここでは、主な属性変更の方法について解説します。

方法1:列名(カラム名)の変更とリネーム方法

データフレームの列名を変更する方法について解説します。

1.1 単純な列名の変更

データフレームの列名を変更するには、rename()メソッドを使います。以下は、データフレームの列名を変更する例です。

import pandas as pd

# サンプルデータの作成
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})
print('変更前')
print(df)

# 列名を変更する
df = df.rename(columns={'A': 'X', 'B': 'Y'})
print('変更後')
print(df)

上記のコードでは、rename()メソッドを使って、列名を辞書形式で指定して変更しています。このとき、元の列名と変更後の列名をそれぞれキーと値に指定します。実行すると、以下のような結果が得られます。

変更前
   A  B  C
0  1  4  7
1  2  5  8
2  3  6  9
# 変更後
   X  Y  C
0  1  4  7
1  2  5  8
2  3  6  9

1.2 正規表現による複数列のリネーム

列名に正規表現を使って、複数の列を一度にリネームする方法を解説します。正規表現とは、文字列のパターンを定義するための特殊な文字列です。

import pandas as pd
import re

# サンプルデータの作成
df = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6], 'c': [7, 8, 9], 'd': [10, 11, 12]})
print('変更前')
print(df)

# 正規表現による複数列のリネーム
df = df.rename(columns=lambda x: x.replace('a', 'X').replace('b', 'Y') if re.match(r'a|b', x) else x)
print('変更後')
print(df)

上記のコードでは、正規表現を使って、列名がaまたはbで始まる列名を、それぞれX、Yに置換しています。

方法2:インデックス名の変更とリネーム方法

データフレームのインデックス名を変更する方法について解説します。

2.1 インデックス名の変更

データフレームのインデックス名を変更するには、rename()メソッドを使います。以下は、データフレームのインデックス名を変更する例です。

import pandas as pd

# サンプルデータの作成
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]}, index=['a', 'b', 'c'])
print('変更前')
print(df)

# インデックス名を変更する
df = df.rename(index={'a': 'X', 'b': 'Y'})
print('変更後')
print(df)

上記のコードでは、rename()メソッドを使って、インデックス名を辞書形式で指定して変更しています。このとき、元のインデックス名と変更後のインデックス名をそれぞれキーと値に指定します。

2.2 インデックスのリセット

データフレームのインデックスをリセットして、0から始まる新しいインデックスを付ける方法を解説します。

import pandas as pd

# サンプルデータの作成
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]}, index=['a', 'b', 'c'])
print('変更前')
print(df)

# インデックスのリセット
df = df.reset_index(drop=True)
print('変更後')
print(df)

上記のコードでは、reset_index()メソッドを使って、インデックスをリセットしています。このとき、drop=Trueとすることで、元のインデックスを削除して新しいインデックスを付けることができます。

方法3:データ型(dtype)の変更とキャスト方法

データフレームの列のデータ型を変更する方法について解説します。

3.1 単純なキャスト

データフレームの列のデータ型を変更するには、astype()メソッドを使います。以下は、データフレームの列のデータ型を変更する例です。

import pandas as pd

# サンプルデータの作成
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4.0, 5.0, 6.0], 'C': ['7', '8', '9']})
print('変更前')
print(df)
# データ型の変更
df['A'] = df['A'].astype('float')
df['B'] = df['B'].astype('int')
df['C'] = df['C'].astype('int')

print('変更後')
print(df)

上記のコードでは、astype()メソッドを使って、列のデータ型を変更しています。このとき、変更後のデータ型を指定します。実行すると、以下のような結果が得られます。

変更前
   A    B  C
0  1  4.0  7
1  2  5.0  8
2  3  6.0  9
# 変更後
     A  B  C
0  1.0  4  7
1  2.0  5  8
2  3.0  6  9

3.2 データ型の変更による欠損値の処理

データ型を変更すると、欠損値の処理に気をつける必要があります。以下は、欠損値を含む列のデータ型を変更する例です。

import pandas as pd
import numpy as np

# サンプルデータの作成
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4.0, np.nan, 6.0]})
print('変更前')
print(df)

# データ型の変更
df['B'] = df['B'].astype('int')
print('変更後')
print(df)

上記のコードでは、列Bに欠損値(np.nan)が含まれている状態で、データ型をintに変更しています。実行すると、以下のような警告メッセージが表示されます。

pandas.errors.IntCastingNaNError: Cannot convert non-finite values (NA or inf) to integer

このような場合は、欠損値を事前に処理する必要があります。

方法4:インデックスの並び替えやリセットによる属性変更

データフレームのインデックスの並び替えやリセットによる属性変更について解説します。

4.1 インデックスの並び替え

データフレームのインデックスを並び替えるには、sort_index()メソッドを使います。以下は、データフレームのインデックスを並び替える例です。

import pandas as pd

# サンプルデータの作成
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['c', 'b', 'a'])
print('変更前')
print(df)

# インデックスの並び替え
df = df.sort_index()
print('変更後')
print(df)

上記のコードでは、sort_index()メソッドを使って、インデックスを昇順に並び替えています。実行すると、以下のような結果が得られます。

変更前
   A  B
c  1  4
b  2  5
a  3  6
# 変更後
   A  B
a  3  6
b  2  5
c  1  4

4.2 インデックスのリセットによる属性変更

データフレームのインデックスをリセットして、新しい列として付ける方法を解説します。

import pandas as pd

# サンプルデータの作成
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]}, index=['a', 'b', 'c'])
print('変更前')
print(df)

# インデックスのリセット
df = df.reset_index()
print('変更後')
print(df)

上記のコードでは、reset_index()メソッドを使って、インデックスをリセットして、新しい列として追加しています。実行すると、以下のような結果が得られます。

変更前
   A  B  C
a  1  4  7
b  2  5  8
c  3  6  9
# 変更後
  index  A  B  C
0     a  1  4  7
1     b  2  5  8
2     c  3  6  9

方法5:カテゴリ変数の属性変更とダミー変数への変換

データフレームのカテゴリ変数をダミー変数に変換する方法について解説します。

5.1 カテゴリ変数の属性変更

データフレームのカテゴリ変数の属性を変更するには、astype()メソッドを使います。以下は、データフレームのカテゴリ変数の属性を変更する例です。

import pandas as pd

# サンプルデータの作成
df = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': [1, 2, 3]})
df['A'] = df['A'].astype('category')
print('変更前')
print(df.dtypes)

# カテゴリ変数の属性変更
df['A'] = df['A'].cat.set_categories(['c', 'b', 'a'])
print('変更後')
print(df.dtypes)

上記のコードでは、astype()メソッドを使って、列Aをカテゴリ型に変更しています。その後、cat.set_categories()メソッドを使って、カテゴリ変数の属性を変更しています。実行すると、以下のような結果が得られます。

変更前
A    object
B     int64
dtype: object
# 変更後
A    category
B       int64
dtype: object

5.2 カテゴリ変数からダミー変数への変換

データフレームのカテゴリ変数をダミー変数に変換するには、get_dummies()関数を使います。以下は、データフレームのカテゴリ変数をダミー変数に変換する例です。

import pandas as pd

# サンプルデータの作成
df = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': [1, 2, 3]})
df['A'] = df['A'].astype('category')
print('変換前')
print(df)
# ダミー変数への変換
df = pd.get_dummies(df, columns=['A'])
print('変換後')
print(df)

上記のコードでは、get_dummies()関数を使って、列Aをダミー変数に変換しています。実行すると、以下のような結果が得られます。

変換前
   A  B
0  a  1
1  b  2
2  c  3
# 変換後
   B  A_a  A_b  A_c
0  1    1    0    0
1  2    0    1    0
2  3    0    0    1

まとめ

本記事では、Pandasで属性を変更する方法について解説しました。

  • 方法1:列名(カラム名)の変更とリネーム方法
  • 方法2:インデックス名の変更とリネーム方法
  • 方法3:データ型(dtype)の変更とキャスト方法
  • 方法4:インデックスの並び替えやリセットによる属性変更
  • 方法5:カテゴリ変数の属性変更とダミー変数への変換

Pandasの属性を変更する方法を覚えて、データ分析の効率を上げましょう。