pandasを使ってデータを整理しているとき、列名を変更したいときありますよね。
この記事ではpandasで列名を変更する方法を紹介します。
pandasで行名・列名を変更する4つの方法
pandasで行・列名を変更する方法に次のようなものがあります。
- 任意の行・列名に変更する: rename
- 列名の前後に文字列を追加: add_prefix, add_suffix
- 行・列名を一括変更する: set_axis
- 元の行・列名を一括変更する: columns, index
renameが使いやすく汎用性があるのでおすすめです。
この記事に載せているコードは全てグーグルコラボラトリーで記述・動作を確認しています。
紹介に入る前に、pandasのインポートや使用するDataFrameを用意します。
import pandas as pd
point_list = [[51, 70, 35],
[21, 0, 55],
[14, 74, 23],
]
point_data = pd.DataFrame(data=point_list, columns=['国語', '数学', '英語'], index=['A', 'B', 'C'])
point_data
出力:
index | 地理 | 日本史 | 世界史 |
---|---|---|---|
1組 | 51 | 70 | 35 |
2組 | 21 | 0 | 55 |
3組 | 14 | 74 | 23 |
任意の行・列名に変更する: rename
renameは指定した行や列の名前を任意の名に変更できます。
名前を変更したい行や列を指定できるため、使い勝手の良い方法です。
pandas.DataFrame.rename(columns={‘変更したい列名’: ‘C変更後の列名’})で列名の変更が可能です。
変更後のDataFrameは保存されないので、新しく変数をつけて格納しましょう。
point_dataの列名「国語」を「japanese」に変更してみます。
rename_jap = point_data.rename(columns={'国語':'japanese'})
rename_jap
出力:
index | japanese | 数学 | 英語 |
---|---|---|---|
A | 51 | 70 | 35 |
B | 21 | 0 | 55 |
C | 14 | 74 | 23 |
列名を変更したい場合は、pandas.DataFrame.rename(index={‘変更したい列名’: ‘変更後の列名’})と記述します。
また、一度に複数の行・列名を変更できます。
行名「A」「B」「C」を「X」「Y」「Z」に変更してみましょう。
rename_XYZ = point_data.rename(index={'A':'X', 'B':'Y', 'C':'Z'})
rename_XYZ
出力:
index | 国語 | 数学 | 英語 |
---|---|---|---|
X | 51 | 70 | 35 |
Y | 21 | 0 | 55 |
Z | 14 | 74 | 23 |
行名と列名を同時に変更も可能です。
行名を「D」「E」「F」、列名を「jap」「math」「eng」に変更します。
rename_all = point_data.rename(index={'A':'D', 'B':'E', 'C':'F'}, columns={'国語':'jap', '数学':'math', '英語':'eng'})
rename_all
出力:
index | jap | math | eng |
---|---|---|---|
D | 51 | 70 | 35 |
E | 21 | 0 | 55 |
F | 14 | 74 | 23 |
列名の前後に文字列を追加: add_prefix, add_suffix
add_prefix、add_suffixは列名の前後に文字列を追加する関数です。
この変更は全ての列名に反映されます。
列名の前に「期末_」を追加してみましょう。
pre_期末 = point_data.add_prefix('期末テスト_')
pre_期末
出力:
index | 期末テスト_国語 | 期末テスト_数学 | 期末テスト_英語 |
---|---|---|---|
A | 51 | 70 | 35 |
B | 21 | 0 | 55 |
C | 14 | 74 | 23 |
今度は列名の後ろに「_追試」を追加します。
suf_追試 = point_data.add_suffix('追試')
suf_追試
出力:
index | 国語追試 | 数学追試 | 英語追試 |
---|---|---|---|
A | 51 | 70 | 35 |
B | 21 | 0 | 55 |
C | 14 | 74 | 23 |
add_prefixとadd_suffixはDataFrameの場合、列名にのみ変更できます。
行名を一括で変更したい場合はrenameを使用します。
カッコ内にlambda関数で列名の前に文字列をたす関数を記述します。
行名の前に「1組_」を追加しましょう。
pre_1組 = point_data.rename(index=lambda n: '1組_' + n)
pre_1組
出力:
index | 国語 | 数学 | 英語 |
---|---|---|---|
1組_A | 51 | 70 | 35 |
1組_B | 21 | 0 | 55 |
1組_C | 14 | 74 | 23 |
同じ方法で行名の後ろに「_さん」を足してみます。
add_さん = point_data.rename(index=lambda n: n + 'さん')
add_さん
出力:
index | 国語 | 数学 | 英語 |
---|---|---|---|
Aさん | 51 | 70 | 35 |
Bさん | 21 | 0 | 55 |
Cさん | 14 | 74 | 23 |
行・列名を一括変更する: set_axis
set_axisを使用することで行・列名を一括変更できます。
renameでも一括変更は可能ですが、set_axisの利点は変更したい行・列名を毎回指定する手間がないことです。
記述方法はpandas.DataFrame.set_axis([変更後の行・列名のリスト], axix=行・列の指定)です。
引数axisに0 または ‘index’と指定することで行名、1 または ‘columns’の記述で列名にリストを反映します。
この際、リストの個数と行・列の数が違うとエラーになるので注意してください。
行名を「S」「T」「U」に変更します。
set_stu = point_data.set_axis(['S', 'T', 'U'], axis=0)
set_stu
出力:
index | 国語 | 数学 | 英語 |
---|---|---|---|
S | 51 | 70 | 35 |
T | 21 | 0 | 55 |
U | 14 | 74 | 23 |
今度は列名を「音楽」「美術」「体育」に変更します。
set_col = point_data.set_axis(['音楽', '体育', '美術'], axis='columns')
set_col
出力:
index | 音楽 | 体育 | 美術 |
---|---|---|---|
A | 51 | 70 | 35 |
B | 21 | 0 | 55 |
C | 14 | 74 | 23 |
元の行・列名を一括変更する: columns, index
行・列名を一括変更する方法として、columns,indexを更新する方法があります。
pandas.DataFrame.columns = [変更後の列名のリスト]のように記述します。
元のDataFrame更新される点に注意してください。
列名をcolumnsで「地理」「日本史」「世界史」に変更してみます。
point_data.columns = ['地理', '日本史', '世界史']
point_data
出力:
index | 地理 | 日本史 | 世界史 |
---|---|---|---|
1組 | 51 | 70 | 35 |
2組 | 21 | 0 | 55 |
3組 | 14 | 74 | 23 |
最初に用意したDataFrameである、point_dataが更新されていることが分かります。
同様にindexで行名を「1組」「2組」「3組」と変更して、確認してみましょう。
point_data.index = ['1組', '2組', '3組']
point_data
出力:
index | 地理 | 日本史 | 世界史 |
---|---|---|---|
1組 | 51 | 70 | 35 |
2組 | 21 | 0 | 55 |
3組 | 14 | 74 | 23 |
pandas.Seriesで行名を変更する
これまでpandas.DataFrameでの行・列名の変更方法について紹介してきましたが、これらの方法はpandas.Seriesでも使用可能です。
使い方は基本的にpandas.DataFrameと同じです。
最初にseriseを用意します。
point_serise = pd.Series([51, 70, 35], name='J')
point_serise
出力:
0 51
1 70
2 35
Name: J, dtype: int64
rename
renameで行名(インデックス名)の変更が可能です。
行名「0」「1」「2」を「A」「B」「C」へ変更します。
rename_rerise = point_serise.rename({0:'A', 1:'B', 2:'C'})
rename_rerise
出力:
A 51
B 70
C 35
Name: J, dtype: int64
Serise.renameでは、列名を変更する代わりにSeriseの名前が変更できます。
現在seriseの名前が「J」なので、これを「japanese」に変更します。
print(point_serise.name)
jap_sr = point_serise.rename('japanese')
print(jap_sr.name)
出力:
J
japanese
add_prefix, add_suffix
add_prefix, add_suffixは、DataFrameでは列名の前後に文字列を追加していました。Seriseでは行名前後に文字列を追加します。
行名の前に「class1_」を追加してみましょう。
pre_sr = point_serise.add_prefix('class1_')
pre_sr
出力:
class1_0 51
class1_1 70
class1_2 35
Name: J, dtype: int64
行名の後ろに「_jap」を追加します。
suf_sr = point_serise.add_suffix('_Jap')
suf_sr
出力:
0_Jap 51
1_Jap 70
2_Jap 35
Name: J, dtype: int64
set_axis
set_axisで行名を一括変更できます。
行名を「D」「E」「F」に一括変更します。
axis_sr = point_serise.set_axis(['D', 'E', 'F'])
axis_sr
出力:
D 51
E 70
F 35
Name: J, dtype: int64
index
Serise.indexで行名を「X」「Y」「Z」に変更して、元のSeriseを更新します。
point_serise.index = ['X', 'Y', 'Z']
point_serise
出力:
X 51
Y 70
Z 35
Name: J, dtype: int64
まとめ
今回はpandasで行名・列名を変更する方法を紹介しました。
renameは指定した行名・列名を指定して変更できるので、使い勝手が良くおすすめです。
コメント