PandasでCSVを読み込んだあと、列名が英語のままだったり、空白や大文字が混ざっていて扱いにくかったりすることがあります。
そんなときに使うのが rename() です。
rename() を使うと、必要な列だけを安全に変更できます。
一方で、すべての列名をまとめて変えたい場合は df.columns = [...] を使うこともあります。
この記事では、pandas rename() の基本から、一部の列だけ変更する方法、columns を直接上書きする方法との違い、index ラベルと index 名の違い、反映されないときの原因まで、初心者向けに順番に整理します。
読み終えるころには、「一部だけ変えるなら rename()」「全部まとめて変えるなら df.columns」 という使い分けが、迷わずできるようになります。
この記事でわかること
rename()で列名を変更する基本形- 一部の列だけ変更する方法
- index ラベルと index 名の違い
columns上書きとの違いrename()が反映されない原因と対処- CSV読込後の前処理の中で
rename()を使うタイミング
このページは、Pandas DataFrame入門 から続く前処理系の記事です。
DataFrameの基本を確認したあとに、「読みやすい列名へ整える」練習として読むと流れがつかみやすくなります。
rename()とは?どんな場面で使うのか
rename() は、列名や行ラベルを一部だけ変更したいときによく使うメソッドです。
たとえば、次のような場面で役立ちます。
- CSV を読み込んだら列名が英語で分かりにくい
- 長い列名を短くして書きやすくしたい
- 一部の列だけ日本語にしたい
- index の表示名を整えたい
この記事では、すぐ試せるように StringIO を使ってCSVサンプルを読み込んでいます。
StringIO は、CSVの文字列を CSVファイルのように扱うための仕組み です。
手元にCSVファイルがなくても、その場で read_csv() の動きを試せます。
実務では pd.read_csv('sales.csv') の形で使うことが多く、StringIO は説明用コードや動作確認で便利です。
先に結論
- 一部だけ列名を変えるなら
rename(columns={...})- 全部まとめて変えるなら
df.columns = [...]- 変わらないときは、まず
df = df.rename(...)と代入しているか確認します
この記事では、「一部だけ列名を変えたい」「rename() が反映されない」「df.columns との違いが分からない」 という悩みを順番に解決します。
import pandas as pd
from io import StringIO
csv_data = '''Order ID,Product Name,Sales Amount,Customer Count,Staff Name
1001,Apple,1200,25,Tanaka
1002,Orange,980,,Sato
1003,Banana,1100,30,
1004,Grape,1500,28,Suzuki
'''
df = pd.read_csv(StringIO(csv_data))
print(df)
print('\n列名一覧:')
print(df.columns.tolist())
| Order ID | Product Name | Sales Amount | Customer Count | Staff Name | |
|---|---|---|---|---|---|
| 0 | 1001 | Apple | 1200 | 25.0 | Tanaka |
| 1 | 1002 | Orange | 980 | Sato | |
| 2 | 1003 | Banana | 1100 | 30.0 | |
| 3 | 1004 | Grape | 1500 | 28.0 | Suzuki |
列名一覧:
['Order ID', 'Product Name', 'Sales Amount', 'Customer Count', 'Staff Name']
実行すると、英語の列名がそのまま入った DataFrame が表示されます。
このままでも処理はできますが、初心者のうちは列名が英語のままだと、
- どの列を使っているのか分かりにくい
- 後で
astype()やfillna()を書くときに迷いやすい - 集計コードを読んだときに意味を追いにくい
という問題が出やすいです。
使い方の細かい違いを見る前に、まずは最初に覚えたい基本形を確認していきましょう。
まずは結論:rename() の基本形
列名変更で最初に覚えたいのは、次の書き方です。
df = df.rename(columns={'古い列名': '新しい列名'})
この形なら、必要な列だけ変更できます。
全部の列名を一気に書き換える必要がないため、最初に覚える基本形として使いやすいです。
まずは、一部の列だけ日本語に変えてみましょう。
df_renamed = df.rename(columns={
'Sales Amount': '売上',
'Customer Count': '来店者数'
})
print(df_renamed)
print('\n変更後の列名一覧:')
print(df_renamed.columns.tolist())
| Order ID | Product Name | 売上 | 来店者数 | Staff Name | |
|---|---|---|---|---|---|
| 0 | 1001 | Apple | 1200 | 25.0 | Tanaka |
| 1 | 1002 | Orange | 980 | Sato | |
| 2 | 1003 | Banana | 1100 | 30.0 | |
| 3 | 1004 | Grape | 1500 | 28.0 | Suzuki |
変更後の列名一覧:
['Order ID', 'Product Name', '売上', '来店者数', 'Staff Name']
このように、指定した列だけが変更されます。
ここで大事なのは、全部の列名を書かなくてよいことです。
rename() は、辞書で指定した列だけを変え、指定していない列はそのまま残します。
たとえば、CSV読込後に「まずこの2列だけ分かりやすくしたい」という場面では、この書き方が自然です。
見た目で理解する rename() の変化
変更前→変更後を先に見る
まずは、rename() で何が変わるのかを列名だけで見ると、次のようなイメージです。
変更前
['Order ID', 'Product Name', 'Sales Amount', 'Customer Count', 'Staff Name']
rename(columns={'Sales Amount': '売上', 'Customer Count': '来店者数'})
変更後
['Order ID', 'Product Name', '売上', '来店者数', 'Staff Name']
このように、rename() は 指定した列だけを部分的に変更できる のが特徴です。
DataFrameの値そのものは変わらず、見出しとして使う名前だけを整えます。
| 状態 | 列名一覧 |
|---|---|
| 変更前 | ['Order ID', 'Product Name', 'Sales Amount', 'Customer Count', 'Staff Name'] |
| 変更後 | ['Order ID', 'Product Name', '売上', '来店者数', 'Staff Name'] |
前処理の早い段階で列名を整えておくと、このあとに続く型変換や欠損値処理、集計のコードも読みやすくなります。
列の並びと変化を、図として見ると次のイメージです。
変更前
[Order ID] [Product Name] [Sales Amount] [Customer Count] [Staff Name]
↓ ↓
変更後
[Order ID] [Product Name] [売上] [来店者数] [Staff Name]
この図から分かるように、rename() は 指定した列名だけを差し替え、他の列はそのまま残す メソッドです。
そのため、「全部を変えるほどではないが、一部だけ分かりやすくしたい」という場面に向いています。
pandas rename() と df.columns の違い|一部変更と全体変更の使い分け
rename() とよく比較されるのが、df.columns = [...] で列名をまとめて入れ替える方法です。
こちらは、すべての列名を一気に入れ替えたいときに向いています。
一方で、rename() は 必要な列だけ変更したいとき に向いています。
つまり、最初は次のように覚えると分かりやすいです。
- 一部だけ変えるなら
rename(columns={...}) - 全部まとめて変えるなら
df.columns = [...]
どちらも列名変更ですが、使う場面が少し違います。
df_all_columns = df.copy()
df_all_columns.columns = ['注文ID', '商品名', '売上', '来店者数', '担当者']
print(df_all_columns)
print('\n変更後の列名一覧:')
print(df_all_columns.columns.tolist())
| 注文ID | 商品名 | 売上 | 来店者数 | 担当者 | |
|---|---|---|---|---|---|
| 0 | 1001 | Apple | 1200 | 25.0 | Tanaka |
| 1 | 1002 | Orange | 980 | Sato | |
| 2 | 1003 | Banana | 1100 | 30.0 | |
| 3 | 1004 | Grape | 1500 | 28.0 | Suzuki |
変更後の列名一覧:
['注文ID', '商品名', '売上', '来店者数', '担当者']
df.columns = [...] は、全部まとめてきれいに名前をそろえたいときには便利です。
ただし、列数と順番を合わせる必要があるため、初心者のうちは少し注意が必要です。
最初は、次の基準だけ覚えれば十分です。
- 一部だけ変更したい →
rename(columns={...}) - すべての列名を一括で変更したい →
df.columns = [...]
迷ったら、まずは rename() から使い始めるのがおすすめです。
df.columns = [...] で失敗しやすい例
df.columns = [...] は、すべての列名を一括で変更したいときに便利です。
ただし、列数をぴったり合わせる必要があるため、初心者のうちはここでつまずくことがあります。
一部だけ変えたいのに df.columns = [...] を使うと、列名を全部書かなければならず、ミスもしやすくなります。
そのため、最初は 一部だけ変えるなら rename() と覚えておくと安全です。
df_error = df.copy()
try:
df_error.columns = ['注文ID', '商品名', '売上']
except ValueError as e:
print(e)
Length mismatch: Expected axis has 5 elements, new values have 3 elements
このように、df.columns = [...] は列数が合わないとエラーになります。
一方、rename(columns={...}) は必要な列だけを指定できるため、部分的な変更に向いています。
- 一部だけ変更したい →
rename(columns={...}) - すべての列名を一括で変更したい →
df.columns = [...]
初心者のうちは、まず rename() を基本にするほうが分かりやすいです。
実務では「読込直後に必要な列だけ整える」ことが多いです
実務では、CSVを読み込んだ直後に、よく使う列だけ先に分かりやすい名前へ直すことがあります。
最初に列名を整えておくと、このあと astype() や groupby() を書くときに意味を追いやすくなります。
df_work = df.rename(columns={
'Sales Amount': '売上',
'Customer Count': '来店者数',
'Staff Name': '担当者'
})
print("変更前:", df.columns.tolist())
print("変更後:", df_work.columns.tolist())
df_work.head()
変更前: ['Order ID', 'Product Name', 'Sales Amount', 'Customer Count', 'Staff Name'] 変更後: ['Order ID', 'Product Name', '売上', '来店者数', '担当者']
| Order ID | Product Name | 売上 | 来店者数 | 担当者 | |
|---|---|---|---|---|---|
| 0 | 1001 | Apple | 1200 | 25.0 | Tanaka |
| 1 | 1002 | Orange | 980 | Sato | |
| 2 | 1003 | Banana | 1100 | 30.0 | |
| 3 | 1004 | Grape | 1500 | 28.0 | Suzuki |
このように、分析でよく使う列だけ先に整えると、その後のコードがかなり読みやすくなります。
astype()でどの列の型を直すのか分かりやすいgroupby()で何を集計しているのか追いやすい- 英語列名や空白を毎回気にしなくてよくなる
特に初心者のうちは、最初に列名を読みやすく整えるだけでも前処理全体が追いやすくなります。
pandas rename() で index を変更する方法|行ラベル変更と index名変更の違い
rename() では、列名だけでなく行ラベルも変更できます。
ただし、ここは少し混同しやすいポイントです。最初は次のように覚えると整理しやすくなります。
- indexラベル変更
→ 行の番号そのものを変える - index名変更
→ index列の見出しの名前を付ける
違いを表にすると、次のようになります。
| やりたいこと | 書き方 | 変わるもの |
|---|---|---|
| 列名を一部だけ変更 | rename(columns={...}) |
指定した列名だけ |
| 列名を全部変更 | df.columns = [...] |
すべての列名 |
| 行ラベルを変更 | rename(index={...}) |
index の値そのもの |
| index の名前を付ける | rename_axis('名前') |
index の見出し |
では、実際に行ラベルと index名がどう変わるのかを見てみます。
df_index = df.rename(columns={
'Order ID': '注文ID',
'Product Name': '商品名'
}).set_index('注文ID')
print('元のDataFrame')
print(df_index)
print('\nindex ラベルを変更した場合')
df_index_label = df_index.rename(index={1002: 2002})
print(df_index_label)
print('\nindex に名前を付けた場合')
df_index_name = df_index_label.rename_axis('注文番号')
print(df_index_name)
元のDataFrame
| 商品名 | Sales Amount | Customer Count | Staff Name | |
|---|---|---|---|---|
| 1001 | Apple | 1200 | 25.0 | Tanaka |
| 1002 | Orange | 980 | Sato | |
| 1003 | Banana | 1100 | 30.0 | |
| 1004 | Grape | 1500 | 28.0 | Suzuki |
index ラベルを変更した場合
| 商品名 | Sales Amount | Customer Count | Staff Name | |
|---|---|---|---|---|
| 1001 | Apple | 1200 | 25.0 | Tanaka |
| 2002 | Orange | 980 | Sato | |
| 1003 | Banana | 1100 | 30.0 | |
| 1004 | Grape | 1500 | 28.0 | Suzuki |
index に名前を付けた場合
| 商品名 | Sales Amount | Customer Count | Staff Name | |
|---|---|---|---|---|
| 1001 | Apple | 1200 | 25.0 | Tanaka |
| 2002 | Orange | 980 | Sato | |
| 1003 | Banana | 1100 | 30.0 | |
| 1004 | Grape | 1500 | 28.0 | Suzuki |
この結果から分かるように、rename(index={1002: 2002}) は 行ラベルそのもの を変更しています。
一方で rename_axis('注文番号') は、index の上に表示される 名前 を付けています。
ここは初心者がかなり混同しやすいので、次のように覚えると分かりやすいです。
1002 → 2002のように 値そのものを変える →rename(index={...})注文番号のように index の見出し名を付ける →rename_axis()
この記事の範囲では、次のように整理しておけば十分です。
- 列名変更 →
rename(columns={...}) - index ラベル変更 →
rename(index={...}) - index 名変更 →
rename_axis()
名前は似ていますが、変えている対象が違うと覚えておくと混乱しにくくなります。
pandas rename() が反映されない理由|まず確認する3ポイント
rename() がうまく動かないときは、次のポイントを順番に確認すると原因を見つけやすいです。
| 確認ポイント | よくある原因 |
|---|---|
| 戻り値を代入したか | df.rename(...) だけで終わっている |
| 列名が完全一致しているか | 空白・大文字小文字・スペル違い |
| 対象が columns か index か | columns= と index= の指定ミス |
まずは、いちばん多い「代入していないケース」から確認してみましょう。
df_check = pd.read_csv(StringIO(csv_data))
print('最初の列名:')
print(df_check.columns.tolist())
df_check.rename(columns={'Sales Amount': '売上'})
print('\n代入しない場合の列名:')
print(df_check.columns.tolist())
df_check = df_check.rename(columns={'Sales Amount': '売上'})
print('\n代入した場合の列名:')
print(df_check.columns.tolist())
最初の列名:
['Order ID', 'Product Name', 'Sales Amount', 'Customer Count', 'Staff Name']
代入しない場合の列名:
['Order ID', 'Product Name', 'Sales Amount', 'Customer Count', 'Staff Name']
代入した場合の列名:
['Order ID', 'Product Name', '売上', 'Customer Count', 'Staff Name']
このように、rename() は新しい DataFrame を返すので、基本は次のように書くと分かりやすいです。
df = df.rename(columns={'古い列名': '新しい列名'})
この書き方なら、処理の流れを上から追いやすく、初心者でも「どこで列名が変わったのか」が見やすくなります。
inplace=True という書き方を見ることもありますが、まずは代入する書き方を基本にしたほうが読みやすいです。
代入忘れの次に多いのが、列名のスペル違いです。
特に CSV 読込直後は、見た目では同じに見えても、実際には空白や大文字小文字が違っていることがあります。
次は、スペル違いがあるとどうなるかを確認してみましょう。
df_mistake = pd.read_csv(StringIO(csv_data))
print('変更前の列名:')
print(df_mistake.columns.tolist())
df_mistake = df_mistake.rename(columns={'SalesAmount': '売上'})
print('\nスペル違いで rename() を実行した後の列名:')
print(df_mistake.columns.tolist())
変更前の列名:
['Order ID', 'Product Name', 'Sales Amount', 'Customer Count', 'Staff Name']
スペル違いで rename() を実行した後の列名:
['Order ID', 'Product Name', 'Sales Amount', 'Customer Count', 'Staff Name']
この例では、元の列名は Sales Amount なのに、辞書では SalesAmount と空白なしで指定しています。
そのため、rename() を実行しても列名は変わりません。
変わらないときは、まず print(df.columns.tolist()) で現在の列名を確認し、そのあと辞書のキーを見直すと原因を特定しやすいです。
特に CSV 読込直後は、空白・大文字小文字・記号の違いでズレやすいです。
存在しない列名に気づきたい場合は errors='raise' を使う
列名のスペルミスや指定ミスに早く気づきたいときは、errors='raise' を使う方法があります。
通常の rename() は、存在しない列名を指定してもエラーにせず、その指定を無視します。
そのため、初心者のうちは「書いたのに変わらない」と感じることがあります。
そのような場合に errors='raise' を指定すると、間違いにすぐ気づきやすくなります。
df_error_check = pd.read_csv(StringIO(csv_data))
try:
df_error_check.rename(columns={'SalesAmount': '売上'}, errors='raise')
except KeyError as e:
print('指定した列名が見つかりません:')
print(e)
指定した列名が見つかりません:
"['SalesAmount'] not found in axis"
このように、errors='raise' を使うと、存在しない列名を指定したときに KeyError で気づけます。
ただし、毎回使う必要はありません。
まずは df.columns.tolist() で列名を確認し、うまく変わらないときの確認方法として errors='raise' を覚えておくと十分です。
前処理の流れの中で rename() をどこで使うか
rename() は単独で覚えるより、CSV読込後の前処理の流れ の中で位置づけると理解しやすくなります。
実務では、rename() を単独で使うというより、CSV読込後の前処理の入口として使うことが多いです。
初心者向けに整理すると、よくある流れは次のとおりです。
- CSV を読み込む
- 英語や空白入りの列名を
rename()で分かりやすくする astype()などで型を整える- 欠損値を確認・処理する
- 集計や可視化に進む
このように、rename() は前処理のかなり早い段階で使うことが多いメソッドです。
先に列名を整えておくと、その後のコードが読みやすくなり、ミスも減らしやすくなります。
この順番で考えると、rename() は見た目を整えるだけの処理ではなく、このあとに続く前処理や集計を読みやすくするための最初の整理だと分かりやすくなります。
以下では、列名整理 → 欠損補完 → 集計までを短く通して確認します。
workflow_df = pd.read_csv(StringIO(csv_data))
workflow_df = workflow_df.rename(columns={
'Order ID': '注文ID',
'Product Name': '商品名',
'Sales Amount': '売上',
'Customer Count': '来店者数',
'Staff Name': '担当者'
})
workflow_df['来店者数'] = workflow_df['来店者数'].fillna(0).astype(int)
workflow_df['担当者'] = workflow_df['担当者'].fillna('未設定')
summary = workflow_df.groupby('担当者', dropna=False)['売上'].sum()
print('前処理後のDataFrame')
print(workflow_df)
print('\n担当者ごとの売上集計')
print(summary)
前処理後のDataFrame
| 注文ID | 商品名 | 売上 | 来店者数 | 担当者 | |
|---|---|---|---|---|---|
| 0 | 1001 | Apple | 1200 | 25 | Tanaka |
| 1 | 1002 | Orange | 980 | 0 | Sato |
| 2 | 1003 | Banana | 1100 | 30 | 未設定 |
| 3 | 1004 | Grape | 1500 | 28 | Suzuki |
担当者ごとの売上集計
| 売上 | |
|---|---|
| Sato | 980 |
| Suzuki | 1500 |
| Tanaka | 1200 |
| 未設定 | 1100 |
rename() の次にやること
列名を整えたあとは、前処理や集計に進むことが多いです。
rename() は単独で終わる操作ではなく、次の処理を読みやすくするための準備として使われることが多いです。
rename() の次に読まれやすいのは、型変換・欠損値処理・集計 の記事です。
列名を整えたあとに読むと、前処理全体の流れがつかみやすくなります。
この流れを見ると、rename() は単なる文法ではなく、後続の処理を読みやすくするための前準備 だと分かります。
たとえば、英語列名のまま groupby('Staff Name') と書くより、先に 担当者 に直してから集計したほうが、何をしているのか見失いにくくなります。
- CSV読込から確認したい → Google Colab CSV 読み込み&保存入門
- 列の型を整えたい → pandas astype()の使い方
- 欠損値を処理したい → pandas fillna()の使い方
- 集計したい → Pandas groupby×aggの使い方
- 並び替えたい → pandas 並び替え(sort)入門
初心者のうちは、rename() を「名前を変えるだけの小さな操作」と考えるより、前処理を読みやすく整える最初の一歩 として覚えると理解しやすいです。
発展メモ:関数を使って列名をまとめて整える方法
ここからは少し応用です。
本文の中心は、あくまで 辞書を使った rename(columns={...}) です。
ただ、実務では列名に空白・大文字・記号が混ざっていて、まとめて少し整えたいことがあります。
そのようなときは、rename() に関数を渡す書き方も使えます。
たとえば、次のような整形をまとめて行えます。
- 前後の空白を消す
- 小文字にそろえる
- 空白をアンダースコア
_に変える
「こういう使い方もある」と知っておく程度で大丈夫です。
df_func = pd.read_csv(StringIO(csv_data))
df_func = df_func.rename(columns=lambda x: x.strip().lower().replace(' ', '_'))
print(df_func)
print('\n変更後の列名一覧:')
print(df_func.columns.tolist())
| order_id | product_name | sales_amount | customer_count | staff_name | |
|---|---|---|---|---|---|
| 0 | 1001 | Apple | 1200 | 25.0 | Tanaka |
| 1 | 1002 | Orange | 980 | Sato | |
| 2 | 1003 | Banana | 1100 | 30.0 | |
| 3 | 1004 | Grape | 1500 | 28.0 | Suzuki |
変更後の列名一覧:
['order_id', 'product_name', 'sales_amount', 'customer_count', 'staff_name']
この例では、列名が次のように整います。
Order ID→order_idProduct Name→product_nameSales Amount→sales_amount
このような書き方は、英語列名を機械的にそろえたいときに便利です。
ただし、初心者のうちはまず 辞書を使った rename(columns={...}) をしっかり理解すれば十分です。
正規表現を使った複雑な列名整形もありますが、それは別記事向きの内容なので、この記事では深入りしません。
まとめ
今回のポイントを整理します。
rename()は、列名や行ラベルを分かりやすく整えるための基本メソッド- 初心者はまず
rename(columns={...})を覚えれば十分 - 一部だけ変更したいなら
rename()、全部まとめて変更したいならdf.columns = [...] rename(index={...})は行ラベル変更、rename_axis()は index名変更- 列名が変わらないときは、代入忘れ と 列名の不一致 を最初に確認する
rename() は小さな操作に見えますが、その後の型変換や欠損値処理、集計を読みやすくする大事な前処理です。
迷ったら、まずは 一部だけ列名を変えるなら rename(columns={...}) と覚えておけば十分です。
列名を整えたあとは、次に astype() で型を整えると前処理全体が進めやすくなります。
続けて学びたい方は、型変換の基本を解説した astype() の記事 もあわせて見てみてください。
次に読みたい関連記事
pandas で列名を一部だけ変更するにはどう書けばよいですか?
df = df.rename(columns={'古い列名': '新しい列名'}) と書きます。
この方法なら、必要な列だけ安全に変更できます。
rename() を使ったのに元の DataFrame が変わらないのはなぜですか?
rename() の戻り値を代入していない可能性があります。df = df.rename(...) の形で書くと分かりやすいです。
columns を直接代入する方法と rename() は何が違いますか?
rename() は一部だけ変更したいときに向いています。df.columns = [...] は全部まとめて列名を入れ替えたいときに向いています。
index 名の変更にも rename() は使えますか?
rename(index={...}) で変えられるのは index ラベルです。
index の名前自体を付けたいときは rename_axis() を使います。
初心者はまず「行ラベルの変更」と「index の名前付け」は別だと覚えておくと混乱しにくいです。
存在しない列名を rename() に指定するとどうなりますか?
通常はエラーにならず、その指定だけ何も変わらないことがあります。
そのため、思った通りに変わらないときは df.columns.tolist() で実際の列名を確認するのがおすすめです。
列名の間違いをエラーとして確認したい場合は、errors='raise' を指定すると KeyError で気づけます。
inplace=True は使ったほうがよいですか?
初心者のうちは、df = df.rename(...) のように 代入する書き方 のほうが流れを追いやすいです。
記事や書籍で inplace=True を見かけることはありますが、まずは代入する基本形を押さえれば十分です。
コメント