pandas.DataFrameの行名・列名の変更
pandas.DataFrame
の行名(インデックス, index
)・列名(カラム名, columns
)を変更するには以下についてサンプルコードとともに説明する。
- 任意の行名・列名を変更:
rename()
- 複数の行名・列名を変更
- 元のオブジェクトを変更: 引数
inplace
- ラムダ式や関数で一括処理
- 列名にプレフィックス、サフィックスを追加:
add_prefix()
,add_suffix()
- 行名・列名をすべて変更:
index
,columns
属性を更新 pandas.Series
の場合
既存の列をインデックス(行名)に設定する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
任意の行名・列名を変更: rename()
pandas.DataFrame
のrename()
メソッドを使うと任意の行名・列名を変更できる。
rename()
メソッドの引数index
およびcolumns
に、{元の値: 新しい値}
のように辞書型で元の値と新しい値を指定する。
index
が行名でcolumns
が列名。行名・列名のいずれかだけを変更したい場合は、引数index
とcolumns
のどちらか一方だけを指定すればよい。
新たな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
が返される。
引数inplace
をTrue
にすると、元の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
列名の先頭・末尾に文字列を追加するには専用のメソッドが用意されている。次に説明する。
列名にプレフィックス、サフィックスを追加: add_prefix(), add_suffix()
列名にプレフィックス(接頭辞)、サフィックス(接尾辞)を追加するためのメソッド、add_prefix()
とadd_suffix()
がある。
- pandas.DataFrame.add_prefix — pandas 1.1.2 documentation
- pandas.DataFrame.add_suffix — pandas 1.1.2 documentation
引数に指定した文字列が列名の先頭または末尾に追加される。
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()
のように上書きする。
行名・列名をすべて変更: index, columns属性を更新
行名・列名をすべて新しい値にするのであれば、rename()
メソッドよりも、pandas.DataFrame
のindex
, 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
pandas.Seriesの場合
これまでのpandas.DataFrame
の例と同様に、pandas.Series
のラベル名(index
)も変更できる。
以下のpandas.Series
を例とする。
s = pd.Series([1, 2, 3], index=['ONE', 'TWO', 'THREE'])
print(s)
# ONE 1
# TWO 2
# THREE 3
# dtype: int64
rename()
メソッド。第一引数index
に辞書や呼び出し可能オブジェクトを指定する。ここでは例を省略するが、引数inplace
をTrue
とすると元のオブジェクトが変更される。
print(s.rename({'ONE': 'a', 'THREE': 'c'}))
# a 1
# TWO 2
# c 3
# dtype: int64
print(s.rename(str.lower))
# one 1
# two 2
# three 3
# dtype: int64
add_prefix()
, add_suffix()
メソッドも使用可能。
- pandas.Series.add_prefix — pandas 1.1.2 documentation
- pandas.Series.add_suffix — pandas 1.1.2 documentation
print(s.add_prefix('X_'))
# X_ONE 1
# X_TWO 2
# X_THREE 3
# dtype: int64
print(s.add_suffix('_X'))
# ONE_X 1
# TWO_X 2
# THREE_X 3
# dtype: int64
index
属性を更新することもできる。
s.index = ['a', 'b', 'c']
print(s)
# a 1
# b 2
# c 3
# dtype: int64