Pandas DataFrameの行名・列名を変更する方法【完全ガイド】

 

Pandasを使ってデータ分析を行う際、DataFrameの行名(インデックス)や列名を変更したいケースは非常によくあります。この記事では、Pandas DataFrameの行名・列名を効率的に変更するための様々な方法を、実践的なサンプルコードとともに詳しく解説します。

基本的な準備とサンプルデータの作成

まず、この記事で使用するサンプルDataFrameを作成しましょう。

import pandas as pd

# サンプルデータの作成
df = pd.DataFrame({
    'col1': [1, 2, 3],
    'col2': [4, 5, 6],
    'col3': [7, 8, 9]
}, index=['row1', 'row2', 'row3'])

print(df)

このコードを実行すると、以下のようなDataFrameが作成されます:

      col1  col2  col3
row1     1     4     7
row2     2     5     8
row3     3     6     9

列名を変更する方法

columnsプロパティで一括変更

最もシンプルな方法は、columnsプロパティに新しい列名のリストを直接代入することです。

# 全ての列名を一括変更
df.columns = ['A', 'B', 'C']
print(df)

この方法は全ての列名を同時に変更したい場合に適しています。ただし、列の数と新しい名前の数が一致している必要があります。

rename()メソッドで部分的に変更

特定の列名だけを変更したい場合は、rename()メソッドが便利です。

# 特定の列名のみ変更
df_renamed = df.rename(columns={'col1': 'データ1', 'col2': 'データ2'})
print(df_renamed)

rename()メソッドの利点は、変更したい列だけを指定できることです。また、inplace=Trueパラメータを使用すると、元のDataFrameを直接変更できます。

# 元のDataFrameを直接変更
df.rename(columns={'col3': 'データ3'}, inplace=True)

辞書を使った列名の変更パターン

より複雑な列名変更パターンも、辞書を活用することで柔軟に対応できます。

# 複数の列名を同時に変更
column_mapping = {
    'col1': '売上',
    'col2': '利益', 
    'col3': '費用'
}
df = df.rename(columns=column_mapping)
print(df)

行名(インデックス)を変更する方法

indexプロパティで一括変更

列名と同様に、indexプロパティを使って行名を一括変更できます。

# 全ての行名を一括変更
df.index = ['2021年', '2022年', '2023年']
print(df)

rename()メソッドでインデックスを変更

rename()メソッドのindexパラメータを使用して、特定の行名だけを変更することも可能です。

# 特定の行名のみ変更
df = df.rename(index={'row1': '第1四半期', 'row2': '第2四半期'})
print(df)

高度な変更テクニック

関数を使った変更

rename()メソッドでは、辞書の代わりに関数を渡すこともできます。これにより、より動的な名前変更が可能になります。

# 列名を大文字に変換
df = df.rename(columns=str.upper)
print(df)

# 行名に接頭辞を追加
df = df.rename(index=lambda x: f'期間_{x}')
print(df)

条件に基づく変更

リスト内包表記や条件分岐を使用して、より複雑な変更ロジックも実装できます。

# 列名に番号を追加
new_columns = [f'{col}_データ' for col in df.columns]
df.columns = new_columns
print(df)

実践的な使用例

CSVファイルから読み込んだデータの列名変更

実際のデータ分析では、CSVファイルから読み込んだデータの列名を日本語に変更することがよくあります。

# CSVファイルの読み込み例(仮想)
# df = pd.read_csv('data.csv')

# 英語の列名を日本語に変更
column_translation = {
    'name': '名前',
    'age': '年齢', 
    'salary': '給与'
}
# df = df.rename(columns=column_translation)

重複する列名の処理

データの結合時に重複する列名が発生した場合の対処法:

# 重複列名のサンプル
df_dup = pd.DataFrame({
    'data': [1, 2], 
    'data': [3, 4]  # 重複列名
})

# 列名に連番を追加
df_dup.columns = [f'data_{i+1}' for i in range(len(df_dup.columns))]
print(df_dup)

エラーの回避とベストプラクティス

よくあるエラーとその対処法

列名・行名変更時によく遭遇するエラーとその回避方法を説明します。

# KeyErrorを回避する安全な変更方法
def safe_rename(df, columns_dict):
    existing_columns = {k: v for k, v in columns_dict.items() if k in df.columns}
    return df.rename(columns=existing_columns)

# 使用例
df = safe_rename(df, {'存在しない列': '新しい名前', 'col1': '存在する列'})

パフォーマンスの考慮事項

大きなDataFrameを扱う場合のパフォーマンス向上のコツ:

# inplace=Trueを使用してメモリ効率を向上
df.rename(columns={'old_name': 'new_name'}, inplace=True)

# 一括変更の方が個別変更より高速
df.columns = ['新列名1', '新列名2', '新列名3']  # 推奨

まとめ

Pandas DataFrameの行名・列名変更は、データ分析において基本的かつ重要な操作です。この記事で紹介した方法を使い分けることで、効率的にデータの可読性を向上させることができます。

主なポイント:

  • 全体変更にはcolumns/indexプロパティが効率的
  • 部分変更にはrename()メソッドが柔軟
  • 関数や条件分岐を活用した動的な変更も可能
  • inplace=Trueでメモリ効率を向上

これらのテクニックを活用して、より読みやすく分析しやすいDataFrameを作成していきましょう。