HOWTO · Python
Python で辞書のキーを変更する
値を保持したまま、Pythonの辞書のキーを1つまたは複数変更する方法を学びます。
このページの内容
Pythonの辞書でキー名を変更するには、値を新しいキーに割り当ててから古いキーを削除します。古い項目の取得と削除をまとめて行う場合は、dict.pop()を使います。複数のキーや条件に応じた変更では、古いキーと新しいキーの対応表を使って新しい辞書を作成できます。いずれの方法でも関連する値を保持できます。元の辞書を更新するか、別の辞書を作るかに応じて方法を選びましょう。
値を新しいキーに割り当てて古いキーを削除する
辞書のキーをその場で編集することはできません。単純にキー名を変更するには、古いキーで値を読み取り、新しいキーに割り当ててから古い項目を削除します。
fruit = {"A": "Apple", "B": "Banana"}
fruit["C"] = fruit["B"]
del fruit["B"]
print(fruit)
この操作では、値"Banana"を保ったままBがCに変わります。更新されるのはfruit自体です。すでにCが存在する場合、そこへの割り当てによって現在の値が置き換わります。データ上それが問題になる場合は、割り当て先のキーが未使用であることを確認してください。
dict.pop()でキーを変更する
dict.pop()は指定したキーを削除し、その値を返します。返された値をそのまま新しいキーに割り当てられます。
person = {"first_name": "John", "last_name": "Doe", "age": 30}
person["given_name"] = person.pop("first_name")
割り当て後、personには以前のfirst_nameの値を持つgiven_nameが含まれます。直接代入する場合と同様に、given_nameがすでに存在すれば、その値は置き換わります。古いキーが存在しない可能性がある場合は、person.pop("first_name", None)のようにpopへデフォルト値を指定してください。デフォルト値を指定せず、存在しないキーに対して呼び出すとKeyErrorが発生します。
辞書を再構築して1つ以上のキーを変更する
複数のキーを変更する場合や、条件に応じて変更する場合は、各古いキーと置き換え先のキーを対応付け、辞書内包表記を使います。対応表にないキーはそのまま残ります。
original = {"a": 1, "b": 2, "c": 3}
key_mapping = {"a": "alpha", "b": "beta"}
renamed = {key_mapping.get(key, key): value for key, value in original.items()}
この例では、renamedに元の値を保ったままalpha、beta、cが含まれます。内包表記は新しい辞書を作るため、originalは変更されずに残ります。異なる2つのキーが同じ置き換え先に対応すると、内包表記で後から割り当てられた値が先の値を上書きします。すべての値を残す必要がある場合は、対応表によって異なるキーが生成されるようにしてください。すべてのキーに適用する規則に応じて名前を変更するときや、複数の決まったキーをまとめて変更するときに特に便利です。元のデータに同じ名前へ集約される可能性のあるキーが含まれる場合は、再構築の前に対応表を確認しましょう。
条件付きの変換にも使えます。その場合は、key_mapping.get(key, key)を各項目に対して目的のキーを返す式に置き換えます。キーを返す式は処理対象のデータに対して決定的である必要があります。また、辞書のキーにはハッシュ可能な値が必要なので、変換後のキーもハッシュ可能でなければなりません。
辞書のキーが表形式データを表す場合はDataFrameの列名を変更する
辞書のキーが表形式データの列名である場合は、DataFrame.rename(columns=...)で列名を変更できます。辞書からDataFrameを作成しても、元の辞書のキー名は変わりません。別の表形式オブジェクトが作成されるだけです。たとえば、df = df.rename(columns={"a": "alpha"})のように記述できます。この操作は列名を変更したDataFrameを返し、元の辞書は変更しません。結果から辞書を作る必要があり、値が列ごとのリストである場合は、df.to_dict(orient="list")のように向きを明示してください。このPandas固有の操作を使うには、環境でPandasを利用できる必要があります。通常の辞書では、組み込みの代入、dict.pop()、または内包表記を使うほうが、データ構造を変換せずに済み、一般に簡単です。