【Python】PandasのDataFrameで行名、列名を変更する方法を紹介(一部変更、全変更、列内容を行名にする方法)

【Python】PandasのDataFrameで行名、列名を変更する方法を紹介(一部変更、全変更、列内容を行名にする方法)

この記事では行名や列名の変更方法を紹介しています。
なお紹介しているのは一部変更、全変更、列内容を行名に変更する方法です。

「行番号、列番号を012…とリセットさせたい」という人はこの記事では無く以下の記事で紹介しています。

【Python】Pandasでindex、columnの番号をリセットする方法

 

この記事での目標
・行名、列名の一部変更方法の理解
・行名、列名の全変更方法の理解
・列内容を行名にする方法の理解

 

確認するにあたり以下のDataFrameを中心に使用していきます。

import pandas as pd
df=pd.DataFrame([["A","B","C"],["D","E","F"],["G","H","I"]])
print(df)
"""
#print表示
  0 1 2
0 A B C
1 D E F
2 G H I
"""

 

DataFrameとSeries型の違いがわからない人はまず以下の記事で理解しましょう!!
DataFrameとSeriesの違いを紹介
その他Pythonの記事は以下にまとめています!!

Python記事まとめ

[スポンサーリンク]


行名や列名の一部変更

行名(index)列名(column)の一部だけ変更したいという場合はdf.renameメソッドを使用します。
指定方法は以下の通り

指定のdf.rename(index={元の行名1:変更行名1,元の行名2:変更行名2…},columns={元の列名1:変更列名1,元の列名2:変更列名2…})

では行名の一部変更、列名の一部変更、行名列名の一部変更する場合の例を見ていきましょう。

行名だけ一部変更

行名の一部変更する場合はrenameメソッドindexだけを指定しましょう。
行名0をAA、行名1をBBと変更してみます。

実行前

#print表示
print(df)
#  0 1 2
#0 A B C
#1 D E F
#2 G H I

実行後

df=df.rename(index={0:"AA",1:"BB"})
print(df)
#print表示
#   0 1 2
#AA A B C
#BB D E F
#2 G H I

実際に行名0と1がそれぞれAA、BBと変更されていることが確認できます。

 

列名だけ一部変更

次に列名の一部変更をする場合はrenameメソッドcolumnsを指定するだけです。
では列名0をRA、列名1をRBと変更してみます。

実行前

#print表示
print(df)
"""
  0 1 2
0 A B C
1 D E F
2 G H I
"""

実行後

df=df.rename(columns={0:"RA",1:"RB"})
print(df)
"""
#print表示
 RA RB 2
0 A B C
1 D E F
2 G H I
"""

実際に列名0と1がそれぞれRA,RBと変更されていることが確認できます。

 

行名と列名の一部変更

次に行名列名をまとめて一部変更します。
これはrenameメソッドindexcolumnsをどちらも指定するだけです。

では行名0,1をAA,BBに変更、列名0,1をRA,RBに変更してみましょう。

実行前

#print表示
print(df)
"""
  0 1 2
0 A B C
1 D E F
2 G H I
"""

実行後

df=df.rename(index={0:"AA",1:"BB"},columns={0:"RA",1:"RB"})
print(df)
"""
#print表示
  RA RB 2
AA A B C
BB D E F
2  G H I
"""

実際に行名0,1がAA,BBに変更、列名0,1がRA,RBと変更されていることが確認できます。

 

行名全て変更

一部では無く行名全て変更したい!という場合は以下のように行名のリストを指定します。
この時、リスト内の値の数と行数が一致していないとエラーが発生します。

指定のdf.index = 行名のリスト

では行名を0,1,2からAA,BB.CCに変更してみましょう。

実行前

#print表示
print(df)
"""
  0 1 2
0 A B C
1 D E F
2 G H I
"""

実行後

df.index=["AA","BB","CC"]
print(df)
"""
#print表示
  0 1 2
AA A B C
BB D E F
CC G H I
"""

実際に行名が0,1,2からAA,BB,CCに変更されていることが確認できます。

ちなみにリスト内の数と行数が一致していない場合はValueErrorが発生します。

#行数3なのに2つしか指定しない
df.index=["A","B"]

Traceback (most recent call last):
    File "<ipython-input-21-a038e8ca15df>", line 1, in <module>
        df.index=["A","B"]
    File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py", line 4389, in __setattr__
        return object.__setattr__(self, name, value)
    File "pandas\_libs\properties.pyx", line 69, in pandas._libs.properties.AxisProperty.__set__
    File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py", line 646, in _set_axis
        self._data.set_axis(axis, labels)
    File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals.py", line 3323, in set_axis
        'values have {new} elements'.format(old=old_len, new=new_len))
ValueError: Length mismatch: Expected axis has 3 elements, new values have 2 elements

[スポンサーリンク]


列名全て変更

次に列名全て変更する場合は、以下のように列名をリストで指定しましょう。
この時、リスト内の値の数と列数が一致していないとエラーが発生します。

指定のdf.columns = 列名のリスト

では列名を0,1,2からRA,RB,RCに変更しましょう。

実行前

#print表示
print(df)
"""
  0 1 2
0 A B C
1 D E F
2 G H I
"""

実行後

df.columns=["RA","RB","RC"]
print(df)
"""
#print表示
  RA RB RC
0 A B C
1 D E F
2 G H I
"""

実際に列名が0,1,2からRA,RB,RCに変更されていることが確認できます。

ちなみに行名全て変更の時と同じく、列数とリスト内の数が一致しないとValueErrorが発生します。

#列数3なのに2つしか指定しない
df.columns=["A","B"]

Traceback (most recent call last):
    File "<ipython-input-22-240f8aba7277>", line 1, in <module>
        df.columns=["A","B"]
    File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py", line 4389, in __setattr__
        return object.__setattr__(self, name, value)
    File "pandas\_libs\properties.pyx", line 69, in pandas._libs.properties.AxisProperty.__set__
    File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py", line 646, in _set_axis
        self._data.set_axis(axis, labels)
    File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals.py", line 3323, in set_axis
        'values have {new} elements'.format(old=old_len, new=new_len))
ValueError: Length mismatch: Expected axis has 3 elements, new values have 2 elements

列内容を行名にする

次に列内容を行名にする方法です。
この項目では以下の3行3列のDataFrameを用いて確認します。

import pandas as pd
df=pd.DataFrame([["A",2,3],["B",5,6],["C",8,9]])
"""
#print表示
   0 1 2
0 A 2 3
1 B 5 6
2 C 8 9
"""

この0列目にあるA、B、Cを行名にしてみましょう。
列内容を行名にセットする時に使うのがset_indexメソッドです。

set_index(key, drop=True, append=False, inplace=False, verify_integrity=False)
オプションなど 初期値 説明
key 行名にする列内容
drop True 行名にする列を残すか消すかの設定
append False 元々ある行名を残すか消すのかの設定
inplace False 行名をセットするDataFrameを上書きするかの設定
verify_integrity False セットした行名の内容が被ってないかチェックする設定

最低限必要なのはkeyで任意でオプションを設定できます。
たくさんオプションありますが、単純にset_indexメソッドを使用する場合は次のkeyのみセットを参照すればOKです。

keyのみセット

まずはシンプルにkeyだけを指定した場合です。

#0列の内容をindexにする
df1=df.set_index([0])
"""
#print表示
  1 2
0 
A 2 3
B 5 6
C 8 9
"""

これで0列目の内容が行名になりました。
同じようにただ行名を列内容に変更したい場合はオプションなしでOKです!

dropオプションを使用

次にdropオプションを設定した場合です。
drop行名に使用する列を削除するのか残すのかを設定することができるオプションです。
(Trueで消す、Falseで残す、デフォルトはTrue)

デフォルトのTrueでは削除されるようになっているのでFalseにして確認してみましょう。

#dropを有効にしてindexをセット
df1=df.set_index([0],drop=False)
"""
#print表示
  0 1 2
0 
A A 2 3
B B 5 6
C C 8 9
"""

Falseにしたことで行名に使用した0列目が残っていることがわかります。

appendオプションを使用

次にappendオプションを有効にした場合です。
appendは元々存在している行名を残すか消すのか設定することができるオプションです。
(Falseで消す、Trueで残す、デフォルトではFalse)

Trueにして0列目をindexにセットしてみましょう。

#appendを有効にしてindexセット
df1=df.set_index([0],append=True)
"""
#print表示
    1 2
  0 
0 A 2 3
1 B 5 6
2 C 8 9
"""

元々の行名が残ってそこに0列目の行名に追加され、階層indexになっていることが確認できます。

inplaceオプションを使用

次にinplaceオプションを有効にした場合です。
inplaceオプション行名をセットするDataFrame自体を上書きをするオプションです。
(Trueで上書き、Falseで上書きしない、デフォルトはFalse)

Trueにすると上書きするので戻り値の代入が必要なくなります。
ではinplaceTrueにして0列目をセットしてみましょう。

#dfに上書きする(戻り無し)
df.set_index([0],inplace=True)
"""
#print表示
  1 2
0 
A 2 3
B 5 6
C 8 9
"""

戻り値を代入せずとも0列目がセットされていることがわかります。
まぁ動作自体は以下と同じです。

#動作自体はこれと同じ 
df=df.set_index([0])

ちなみにinplaceオプションを指定したときは戻り値がありません(Noneになる)。

#inplaceが有効だと戻り値はない
value=df.set_index([0],inplace=True)
#valueの#print表示
#None

verify_integrityオプションを使用

verify_integrityオプションを設定した場合です。
verify_integrityオプションは設定する行名で被りがないかチェックをするオプションです。
(Trueでチェック、Falseでチェックしない、デフォルトはFalse)

被ってる内容を使いたいので以下のDataFrameを使用します。

#Aが被ってるDataFrame
df=pd.DataFrame([["A",2,3],["A",5,6],["C",8,9]])
"""
#print表示
  0 1 2
0 A 2 3
1 A 5 6
2 C 8 9
"""

では以上のDataFrameverify_integrityオプションを使用します。

#verify_integrityオプション指定でindexセット
df1=df.set_index([0],verify_integrity=True)

#ERROR発生
    File "<ipython-input-94-11dab431f126>", line 1, in <module>
        df1=df.set_index([0],verify_integrity=True)
    File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3920, in set_index
        dup=duplicates))
ValueError: Index has duplicate keys: Index(['A'], dtype='object', name=0)

Aが被ってるぞ!!というエラーが発生しました。
もちろんverify_integrityオプションFalseにしていると普通にできます。

[スポンサーリンク]


Pandasカテゴリの最新記事