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