pandas

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

MAX

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

スポンサーリンク

add_prefix, add_suffixを使う方法

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

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

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

add_prefix

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

add_suffix

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

add_prefix, add_suffixとinplace

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

1rename_cols = ["colA", "colB"]
2df[rename_cols].add_suffix("_suf", inplace=True)
3# または
4rename_cols = ["colA", "colB"]
5df[rename_cols].add_prefix("pre_", inplace=True)
6
7# TypeError: NDFrame.add_suffix() got an unexpected keyword argument 'inplace'

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

renameを使う方法

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

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

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

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

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

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

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

set_axisを使う方法

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

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

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

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

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

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

まとめ

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

対象列を抜き出して変更

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

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

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

全ての列名を新しく変更

1# set_axis
2axis_names = ["A", "B", "C", "D", "E"]
3df.set_axis(axis_names, axis=1, inplace=True)
スポンサーリンク
ABOUT ME
MAX
MAX
ITエンジニア、データサイエンティスト
新卒でSIerに入社し、フリーランスになってWEB系へ転向。
その後AIの世界へ足を踏み入れ、正社員に戻る。 テーブルデータの分析がメイン。
スポンサーリンク
記事URLをコピーしました