note.nkmk.me

pandas.DataFrameの行名・列名の変更

Date: 2015-07-29 / Modified: 2019-10-31 / tags: Python, pandas

pandas.DataFrameの行名(インデックス, index)・列名(カラム名, columns)を変更するには以下の方法がある。

  • rename()メソッド
    • 任意の行名・列名を変更
  • add_prefix(), add_suffix()メソッド
    • 列名にプレフィックス(接頭辞)、サフィックス(接尾辞)を追加
  • index, columns属性を更新
    • 行名・列名をすべて変更

それぞれの方法についてサンプルコードとともに説明する。

  • rename()メソッド
    • 複数の行名・列名を変更
    • 元のオブジェクトを変更(引数inplace
    • ラムダ式や関数で一括処理
  • add_prefix(), add_suffix()メソッド
  • index, columns属性

また、既存の列をインデックス(行名)に設定するset_index()というメソッドもある。set_index()については以下の記事を参照。

説明のため、以下のようにDataFrameを作成する。

import pandas as pd

df = pd.DataFrame({'A': [11, 21, 31],
                   'B': [12, 22, 32],
                   'C': [13, 23, 33]},
                  index=['ONE', 'TWO', 'THREE'])

print(df)
#         A   B   C
# ONE    11  12  13
# TWO    21  22  23
# THREE  31  32  33
スポンサーリンク

DataFrame.rename()メソッド

pandas.DataFramerename()メソッドを使うと任意の行名・列名を変更できる。

rename()メソッドの引数indexおよびcolumnsに、{元の値: 新しい値}のように辞書型で元の値と新しい値を指定する。

indexが行名でcolumnsが列名。行名・列名のいずれかだけを変更したい場合は、引数indexcolumnsのどちらか一方だけを指定すればよい。

新たなDataFrameが返され、元のDataFrameは変更されない。

df_new = df.rename(columns={'A': 'a'}, index={'ONE': 'one'})
print(df_new)
#         a   B   C
# one    11  12  13
# TWO    21  22  23
# THREE  31  32  33

print(df)
#         A   B   C
# ONE    11  12  13
# TWO    21  22  23
# THREE  31  32  33

複数の行名・列名を変更

複数の行名・列名の値を一括で変更することもできる。

辞書の要素を追加すればOK。

print(df.rename(columns={'A': 'a', 'C': 'c'}))
#         a   B   c
# ONE    11  12  13
# TWO    21  22  23
# THREE  31  32  33

元のオブジェクトを変更(引数inplace)

デフォルトでは元のDataFrameは変更されず、新しいDataFrameが返される。

引数inplaceTrueにすると、元のDataFrameが変更される。新しいDataFrameは返されず、返り値はNone

df_org = df.copy()
df_org.rename(columns={'A': 'a'}, index={'ONE': 'one'}, inplace=True)
print(df_org)
#         a   B   C
# one    11  12  13
# TWO    21  22  23
# THREE  31  32  33

ラムダ式や関数で一括処理

rename()メソッドの引数indexおよびcolumnsには呼び出し可能なオブジェクト(関数など)を指定することもできる。

大文字・小文字を変換する関数を適用する例。

print(df.rename(columns=str.lower, index=str.title))
#         a   b   c
# One    11  12  13
# Two    21  22  23
# Three  31  32  33

ラムダ式(無名関数)で処理することも可能。繰り返したり、末尾に追加したりする例。

print(df.rename(columns=lambda s: s*3, index=lambda s: s + '!!'))
#          AAA  BBB  CCC
# ONE!!     11   12   13
# TWO!!     21   22   23
# THREE!!   31   32   33

列名の先頭・末尾に文字列を追加するには専用のメソッドが用意されている。次に説明する。

DataFrame.add_prefix(), DataFrame.add_suffix()メソッド

列名にプレフィックス(接頭辞)、サフィックス(接尾辞)を追加するためのメソッド、add_prefix()add_suffix()がある。

引数に指定した文字列が列名の先頭または末尾に追加される。

print(df.add_prefix('X_'))
#        X_A  X_B  X_C
# ONE     11   12   13
# TWO     21   22   23
# THREE   31   32   33

print(df.add_suffix('_X'))
#        A_X  B_X  C_X
# ONE     11   12   13
# TWO     21   22   23
# THREE   31   32   33

add_prefix()add_suffix()は列名(columns)を処理するのみ。行名(index)にプレフィックスやサフィックスを追加したい場合は、上述のようにrename()メソッドで引数indexにラムダ式を指定する。

また、add_prefix(), add_suffix()には引数inplaceは実装されていない。元のオブジェクトを更新したい場合はdf = df.add_prefix()のように上書きする。

DataFrame.indexとDataFrame.columns

行名・列名をすべて新しい値にするのであれば、rename()メソッドよりも、pandas.DataFrameindex, columns属性を再指定するほうが簡単。

index, columns属性には、リストやタプル、pandas.Seriesなどを指定できる。

df.index = [1, 2, 3]
df.columns = ['a', 'b', 'c']

print(df)
#     a   b   c
# 1  11  12  13
# 2  21  22  23
# 3  31  32  33

このとき、リストなどのサイズ(要素数)が行数・列数と一致していないとエラーになるので注意。

# df.index = [1, 2, 3, 4]
# ValueError: Length mismatch: Expected axis has 3 elements, new values have 4 elements
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事