この記事では行名や列名の変更方法を紹介しています。
なお紹介しているのは一部変更、全変更、列内容を行名に変更する方法です。
「行番号、列番号を012…とリセットさせたい」という人はこの記事では無く以下の記事で紹介しています。
この記事での目標
・行名、列名の一部変更方法の理解
・行名、列名の全変更方法の理解
・列内容を行名にする方法の理解
確認するにあたり以下のDataFrameを中心に使用していきます。
1 2 3 4 5 6 7 8 9 |
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メソッドを使用します。
指定方法は以下の通り
1 |
指定のdf.rename(index={元の行名1:変更行名1,元の行名2:変更行名2…},columns={元の列名1:変更列名1,元の列名2:変更列名2…}) |
では行名の一部変更、列名の一部変更、行名と列名の一部変更する場合の例を見ていきましょう。
行名だけ一部変更
行名の一部変更する場合はrenameメソッドのindexだけを指定しましょう。
行名0をAA、行名1をBBと変更してみます。
実行前
1 2 3 4 5 6 |
#print表示 print(df) 0 1 2 0 A B C 1 D E F 2 G H I |
実行後
1 2 3 4 5 6 7 8 |
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と変更してみます。
実行前
1 2 3 4 5 6 |
#print表示 print(df) 0 1 2 0 A B C 1 D E F 2 G H I |
実行後
1 2 3 4 5 6 7 8 |
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メソッドでindexとcolumnsをどちらも指定するだけです。
では行名0,1をAA,BBに変更、列名0,1をRA,RBに変更してみましょう。
実行前
1 2 3 4 5 6 |
#print表示 print(df) 0 1 2 0 A B C 1 D E F 2 G H I |
実行後
1 2 3 4 5 6 7 8 |
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と変更されていることが確認できます。
行名全て変更
一部では無く行名全て変更したい!という場合は以下のように行名のリストを指定します。
この時、リスト内の値の数と行数が一致していないとエラーが発生します。
1 |
指定のdf.index = 行名のリスト |
では行名を0,1,2からAA,BB.CCに変更してみましょう。
実行前
1 2 3 4 5 6 |
#print表示 print(df) 0 1 2 0 A B C 1 D E F 2 G H I |
実行後
1 2 3 4 5 6 7 8 |
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が発生します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#行数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 |
[スポンサーリンク]
列名全て変更
次に列名全て変更する場合は、以下のように列名をリストで指定しましょう。
この時、リスト内の値の数と列数が一致していないとエラーが発生します。
1 |
指定のdf.columns = 列名のリスト |
では列名を0,1,2からRA,RB,RCに変更しましょう。
実行前
1 2 3 4 5 6 |
#print表示 print(df) 0 1 2 0 A B C 1 D E F 2 G H I |
実行後
1 2 3 4 5 6 7 8 |
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が発生します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#列数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を用いて確認します。
1 2 3 4 5 6 7 8 |
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メソッドです。
1 |
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だけを指定した場合です。
1 2 3 4 5 6 7 8 9 |
#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にして確認してみましょう。
1 2 3 4 5 6 7 8 9 |
#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にセットしてみましょう。
1 2 3 4 5 6 7 8 9 |
#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にすると上書きするので戻り値の代入が必要なくなります。
ではinplaceをTrueにして0列目をセットしてみましょう。
1 2 3 4 5 6 7 8 9 |
#dfに上書きする(戻り無し) df.set_index([0],inplace=True) #print表示 1 2 0 A 2 3 B 5 6 C 8 9 |
戻り値を代入せずとも0列目がセットされていることがわかります。
まぁ動作自体は以下と同じです。
1 2 |
#動作自体はこれと同じ df=df.set_index([0]) |
ちなみにinplaceオプションを指定したときは戻り値がありません(Noneになる)。
1 2 3 4 |
<span style="font-family: 游ゴシック体, 'Yu Gothic', YuGothic, 'ヒラギノ角ゴシック Pro', 'Hiragino Kaku Gothic Pro', メイリオ, 'Meiryo, Osaka', 'MS Pゴシック', 'MS PGothic', sans-serif; font-size: 14px;">#inplaceが有効だと戻り値はない </span>value=df.set_index([0],inplace=True) #valueの#print表示 None |
verify_integrityオプションを使用
verify_integrityオプションを設定した場合です。
verify_integrityオプションは設定する行名で被りがないかチェックをするオプションです。
(Trueでチェック、Falseでチェックしない、デフォルトはFalse)
被ってる内容を使いたいので以下のDataFrameを使用します。
1 2 3 4 5 6 7 8 |
#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 |
では以上のDataFrameでverify_integrityオプションを使用します。
1 2 3 4 5 6 7 8 9 10 11 |
#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にしていると普通にできます。
[スポンサーリンク]
[…] 【Python】DataFrameで行名、列名を変更する方法を紹介(一部変更、全変更、列… […]
[…] ・index、columnの一部変更、全変更、列内容をindexにセットする方法 ・全てのindexとcolumnの取り出し方 […]