pandas

【Pandas】特定の列名を修正する

列名を修正する方法はいくつかある。各方法は性質が違うため、使いどころがある。

add_prefix, add_suffixを使う方法

prefixは接頭辞、suffixは接尾辞なので、それぞれ、列名の先頭や末尾に特定の文字列を付加することができる。

特定の列を指定して抜き出し、更に加工前にprefixやsuffixを付加したい場合に使う。

import pandas as pd

data = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]
cols = ["colA", "colB", "colC", "colD", "colE"]

df = pd.DataFrame(data=data, columns=cols)
print(df)
>>
   colA  colB  colC  colD  colE
0     1     2     3     4     5
1     6     7     8     9    10
2    11    12    13    14    15

add_prefix

rename_cols = ["colA", "colB"]
print(df[rename_cols].add_prefix("pre_"))
>>
   pre_colA  pre_colB
0         1         2
1         6         7
2        11        12

add_suffix

rename_cols = ["colA", "colB"]
print(df[rename_cols].add_suffix("_suf"))
>>
   colA_suf  colB_suf
0         1         2
1         6         7
2        11        12

add_prefix, add_suffixとinplace

add_prefixとadd_suffixには引数にinplaceが使えないので注意。

rename_cols = ["colA", "colB"]
df[rename_cols].add_suffix("_suf", inplace=True)
# または
rename_cols = ["colA", "colB"]
df[rename_cols].add_prefix("pre_", inplace=True)
>>
TypeError: NDFrame.add_suffix() got an unexpected keyword argument 'inplace'

対象外の列名をそのまま使いたい場合、renameを使う。

renameを使う方法

renameを使うことで、対象の列を指定して列名を変更できる。

df.rename(columns={"colA": "A", "colC": "C", "colE": "E"}, inplace=True)
print(df)
>>
    A  colB   C  colD   E
0   1     2   3     4   5
1   6     7   8     9  10
2  11    12  13    14  15

引数のcolumnsに辞書のキーに変更対象の列名を、値に変更後の列名を指定することで個別に列名を変更できる。

指定しなかった列は何も変化しない。

add_suffixのようなことをしたい時は、リスト内包表記を使うと便利。

rename_cols = ["colA", "colB"]
df.rename(columns={rename_col: f"{rename_col}_suf" for rename_col in rename_cols}, inplace=True)
print(df)
>>
   colA_suf  colB_suf  colC  colD  colE
0         1         2     3     4     5
1         6         7     8     9    10
2        11        12    13    14    15

renameで個別に列名を修正することが可能だが、列名全てを新しくしたい場合はset_axisを使うと便利。

set_axisを使う方法

set_axisを使うことで、列名を全てまとめて変更できる。

axis_names = ["A", "B", "C", "D", "E"]
df.set_axis(axis_names, axis=1, inplace=True)
print(df)
>>
    A   B   C   D   E
0   1   2   3   4   5
1   6   7   8   9  10
2  11  12  13  14  15

 

引数のaxisに1を指定することで、列名を全て新しく変更できる。

なお、axisに0または、axisを指定しない場合、indexを変更することになる。

また、DataFrameの列数と新しい列名の長さが合っていない場合、エラーとなる。

# 元のDataFrameの列数と新しい列名の長さが異なる場合はエラー
axis_names = ["AA", "BB", "CC"]
df.set_axis(axis_names, axis=1, inplace=True)
print(df)
>>
ValueError: Length mismatch: Expected axis has 5 elements, new values have 3 elements

まとめ

用途に合わせて関数を選ぶ。

対象列を抜き出して変更

# add_prefixとadd_suffix
rename_cols = ["colA", "colB"]
df[rename_cols].add_prefix("pre_")
df[rename_cols].add_suffix("_suf")

対象列を指定して列名変更

# rename
df.rename(columns={"colA": "A", "colC": "C", "colE": "E"}, inplace=True)
# renameとリスト内包表記
df.rename(columns={rename_col: f"{rename_col}_suf" for rename_col in rename_cols}, inplace=True)

全ての列名を新しく変更

# set_axis
axis_names = ["A", "B", "C", "D", "E"]
df.set_axis(axis_names, axis=1, inplace=True)