note.nkmk.me

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

Date: 2015-07-29 / Modified: 2017-08-17 / tags: Python, pandas

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

  • pandas.DataFramerename()メソッド
    • 任意の行名・列名を変更
  • pandas.DataFrameindex, 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のどちらか一方だけを指定すればよい。

df_new = df.rename(columns={'A': 'a'}, index={'ONE': 'one'})

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

print(df_new)
#         a   B   C
# one    11  12  13
# TWO    21  22  23
# THREE  31  32  33

複数の行名・列名を変更

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

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

df_new_multi = df.rename(columns={'A': 'a', 'C': 'c'})

print(df_new_multi)
#         a   B   c
# ONE    11  12  13
# TWO    21  22  23
# THREE  31  32  33

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

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

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

df_new = df.rename(columns={'A': 'a'}, index={'ONE': 'one'}, inplace=True)

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

print(df_new)
# None

ラムダ式で一括処理

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

ラムダ式(無名関数)で一括処理する例を示す。

大文字にしたり、小文字にしたり。

df_new = df.rename(columns=lambda s: s.upper(), index=lambda s: s.lower())

print(df_new)
#         A   B   C
# one    11  12  13
# two    21  22  23
# three  31  32  33

繰り返したり、末尾に追加したり。

df_new = df_new.rename(columns=lambda s: s*3, index=lambda s: s + '!!')

print(df_new)
#          AAA  BBB  CCC
# one!!     11   12   13
# two!!     21   22   23
# three!!   31   32   33

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

このとき、サイズ(要素数)が行数・列数と異なっているとエラーになるので注意。

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事