【Pandas】DataFrameやSeriesで数か月後の日付を計算する
MAX
MAX999blog
列名を修正する方法はいくつかある。各方法は性質が違うため、使いどころがある。
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
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
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が使えないので注意。
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を使うことで、対象の列を指定して列名を変更できる。
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を使うことで、列名を全てまとめて変更できる。
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)