Home > 記事 > Python > pandas > 【Python】DataFrameの列名と行名の変更

記事

【Python】DataFrameの列名と行名の変更

pandasではデータはDataFrameに格納されます。DataFrameの操作はデータを扱うのに必須の知識です。今回は行名(index)と列名(columns)の変更方法についてのべます。

目次

  1. 扱うデータ
  2. 行名の変更
  3. 列名の変更
  4. まとめ

扱うデータ

今回扱うデータは以下のCSVデータです。

sample1.csv

"調査年コード","調査年","地域コード","地域","A1101_総人口【人】"
"2015100000","2015年度","C0101","北海道","5381733"
"2015100000","2015年度","C0102","東北","8982807"
"2015100000","2015年度","C0103","関東","45928765"
"2015100000","2015年度","C0104","北陸","5311340"
"2015100000","2015年度","C0105","東海","15031201"
"2015100000","2015年度","C0106","近畿","20725433"
"2015100000","2015年度","C0107","中国","7438037"
"2015100000","2015年度","C0108","四国","3845534"
"2015100000","2015年度","C0109","九州","13016329"
"2015100000","2015年度","C0110","沖縄","1433566"

政府統計の総合窓口であるe-Statからもってきたものです。このページでは政府の統計情報を取得できます。こういった統計情報サイトを知っておくと仕事で分析業務が必要な際に役立つのでどこかでまとめようかとおもいます。

このままCSVだと何の訳にも立たないただのデータです。情報を加工するためDataFrameに読み込みます。前回おこなったようにread_csvでDataFrameにデータを読み込みます。

import pandas as pd
data_frame=pd.read_csv('sample1.csv')
print(data_frame)

実行結果

       調査年コード     調査年  地域コード   地域  A1101_総人口【人】
0  2015100000  2015年度  C0101  北海道       5381733
1  2015100000  2015年度  C0102   東北       8982807
2  2015100000  2015年度  C0103   関東      45928765
3  2015100000  2015年度  C0104   北陸       5311340
4  2015100000  2015年度  C0105   東海      15031201
5  2015100000  2015年度  C0106   近畿      20725433
6  2015100000  2015年度  C0107   中国       7438037
7  2015100000  2015年度  C0108   四国       3845534
8  2015100000  2015年度  C0109   九州      13016329
9  2015100000  2015年度  C0110   沖縄       1433566

上記のようにDataFrameにデータを取り込むことができました。一番最初のカラムが行名でデフォルトでは0からの連番になっています。一番上の行はヘッダでカラム名になっています。ちなみに列名がずれています。printでDataFrameを表示する際に、文字1文字の幅を半角文字1文字として計算して表示してからと思われます(そのように計算するとデータの右端とヘッダの右端がちょうど揃います)。

↑目次

行名の変更

上記でDataFrameで読み込んだデータの行のindexを変更します。インデックスを「地域コード」+'-'+「調査年」になるように修正してみます。

調査年コードから調査年のリストを作成するには以下のようにします(内包展開しています)。

[ str(i)[0:4] for i in data_frame['調査年コード'] ]

地域コードも同様に取り出します

[i for i in data_frame['地域コード']]

取り出した上記それぞれのリストをzipで固めます。

row_list=zip([ str(i)[0:4] for i in data_frame['調査年コード'] ],[i for i in data_frame['地域コード']])

これで「(調査年,地域コード)」のタプルのリストが作成されます。インデックスは「地域コード」+'-'+「調査年」にするので。タプルの要素同士を結合してインデックスを作成します。

[ j + '-' + i for i,j in row_list]

DataFrameでインデックスやカラム名を変更するにはrenameメソッドを用いますがこのメソッドの引数はディクショナリになっており{元の名前: 変更後の名前,…}という形になっています。ですので上記をディクショナリの形に変更します。

row_dic={k:v for k,v in enumerate([ j + '-' + i for i,j in row_list])}

これでrenameメソッドにあたえるパラメータができました。

data_frame_2=data_frame.rename(index=row_dic)

実際にDataFrameがどうなったか、確認してみます。

print(data_frame_2)

以下のように通常は連番で表示される行インデックスが「地域コード」+'-'+「調査年」のように変更されます(緑部分)。

                調査年コード     調査年  地域コード   地域  A1101_総人口【人】   
C0101-2015  2015100000  2015年度  C0101  北海道       5381733
C0102-2015  2015100000  2015年度  C0102   東北       8982807
C0103-2015  2015100000  2015年度  C0103   関東      45928765
C0104-2015  2015100000  2015年度  C0104   北陸       5311340
C0105-2015  2015100000  2015年度  C0105   東海      15031201
C0106-2015  2015100000  2015年度  C0106   近畿      20725433
C0107-2015  2015100000  2015年度  C0107   中国       7438037
C0108-2015  2015100000  2015年度  C0108   四国       3845534
C0109-2015  2015100000  2015年度  C0109   九州      13016329
C0110-2015  2015100000  2015年度  C0110   沖縄       1433566

注意して欲しいのはrenameメソッドでは戻り値に変更後のDataFrameが帰って来ます。元のDataFrameは変更されません。renameという名前をみて元のデータフレームのindexが変更されると思うかもしれませんが、そうではありませんので注意してください。試しに元のDataFrameをみてみます。

print(data_frame)

実行結果

       調査年コード     調査年  地域コード   地域  A1101_総人口【人】
0  2015100000  2015年度  C0101  北海道       5381733
1  2015100000  2015年度  C0102   東北       8982807
2  2015100000  2015年度  C0103   関東      45928765
3  2015100000  2015年度  C0104   北陸       5311340
4  2015100000  2015年度  C0105   東海      15031201
5  2015100000  2015年度  C0106   近畿      20725433
6  2015100000  2015年度  C0107   中国       7438037
7  2015100000  2015年度  C0108   四国       3845534
8  2015100000  2015年度  C0109   九州      13016329
9  2015100000  2015年度  C0110   沖縄       1433566

indexが変わっていないのがわかります。元のDataFrameも変更したい場合、renameメソッドのinplaceパラメータをTrueにします。

data_frame.rename(index=row_dic,inplace=True)

ただしこの場合はrenameメソッドの戻り値はNoneになるので注意してください。つまり

data_frame_2=data_frame.rename(index=row_dic,inplace=True)

としたときdata_frame_2はNoneとなります(data_frameが直接書き換えられ戻り値をもどさない)。

↑目次

列名の変更

列名を変更します。「A1101_総人口【人】」という列を「地域人口」と変更します。

column_dic={'A1101_総人口【人】':'地域人口'}

列を書き換えます。

column_list[4]='地域人口'

書き換えたリストをdata_frameに戻します。

data_frame_2=data_frame.rename(columns=column_dic)
print(data_frame_2)

実行結果

       調査年コード     調査年  地域コード   地域      地域人口
0  2015100000  2015年度  C0101  北海道   5381733
1  2015100000  2015年度  C0102   東北   8982807
2  2015100000  2015年度  C0103   関東  45928765
3  2015100000  2015年度  C0104   北陸   5311340
4  2015100000  2015年度  C0105   東海  15031201
5  2015100000  2015年度  C0106   近畿  20725433
6  2015100000  2015年度  C0107   中国   7438037
7  2015100000  2015年度  C0108   四国   3845534
8  2015100000  2015年度  C0109   九州  13016329
9  2015100000  2015年度  C0110   沖縄   1433566

列と行両方を変更したい場合には、renameメソッドに両方のパラメータを指定するだけです。

data_frame_2=data_frame.rename(index=row_dic, columns=column_dic)
print(data_frame_2)

実行結果

       調査年コード     調査年  地域コード   地域      地域人口
C0101-2015  2015100000  2015年度  C0101  北海道       5381733
C0102-2015  2015100000  2015年度  C0102   東北       8982807
C0103-2015  2015100000  2015年度  C0103   関東      45928765
C0104-2015  2015100000  2015年度  C0104   北陸       5311340
C0105-2015  2015100000  2015年度  C0105   東海      15031201
C0106-2015  2015100000  2015年度  C0106   近畿      20725433
C0107-2015  2015100000  2015年度  C0107   中国       7438037
C0108-2015  2015100000  2015年度  C0108   四国       3845534
C0109-2015  2015100000  2015年度  C0109   九州      13016329
C0110-2015  2015100000  2015年度  C0110   沖縄       1433566

↑目次

まとめ

今回はpandasのデータ分析でデータが格納されるDataFrameのインデックス(行名)、列名の変更についてみてみました。インデックスや列名の変更は良く使うとおもいます。

またメモリを大量に使用するようなデータだとinplace=Trueにする場合も多いとおもいます。一方、加工履歴をとっておきたい場合にはinplaceを指定せず積み上げてゆくほうが良いとおもいます。うまく使い分けてください。

↑目次

Comment on this article

コメントはまだありません。

Send comments

必須
必須  
※ メールアドレスは公開されません
任意
必須
Loading...  Please enter the letters of the image