Python, pandasの基礎⑦ ~データフレームの再インデックス付け「.reindex」編~

記事内に広告が含まれています。

どうも!僕です!
つか〇です!

「データフレームを作ったはいいけど,インデックスの順番変えたやつほしいわ~」
「でも,最初から作んのめんどない?コピペするのはいいけどうざない?」

って思ってる人!!レベル高いですね!!
つか〇はそんな悩みすら出てこなかったです!(レベルが低すぎて)

今回は,その方法とちょっとした応用まで紹介します!!
(引数とか...エトセトラ)

再インデックス付け「.reindex」

まず,インデックスについては,もうおわかりですよね?
わからない方は過去の記事「Python,pandasの基礎① ~pandasの特徴とデータ構造「Series」~」とか,その他numpyの記事でもよいので参考にしてください.
一応ざっくり説明すると,以下のようなデータの座標を表す感じのものです.

import pandas as pd
import numpy as np

obj = pd.Series([30.4, 57.1, -98.0, -23.6], index=["z", "y", "x", "w"])
obj
z    30.4
y    57.1
x   -98.0
w   -23.6
dtype: float64

詳しく言うと,インデックスが「”z”, “y”, “x”, “w”」で数値がデータを表しています.

で,今回何をするかというと,「データの順番変えたい~~~~~」を紹介します.

コピペもいいんですけど,その分コードが多くなって,長くなるのを避けたいですよね.
また,データは上記のように自分で作成したものではなく,実際はどっかからもらった膨大なデータを処理します.
なので,いちいち書いてらんないですよね.

そのときに「.reindex」メソッドを使って,インデックスを書き換えます!

では,インデックス「”z”, “y”, “x”, “w”」を「”w”, “x”, “y”, “z”」にしてみましょう.

obj2 = obj.reindex(["v", "w", "x", "y", "z"])
obj2
v     NaN
w   -23.6
x   -98.0
y    57.1
z    30.4
dtype: float64

見事順番を変えることができました!

でも,なんか「v」が入ってますね?
これは,reindexの引数に既存のインデックスにないインデックスを入れた時,欠損値NaNが代入されていることを示しています.

ffillメソッド

時系列データのような順序があるデータに飛び飛びのデータがあるとします.

「飛んでるデータに近しい値入れたいなー」

ってときです.

そんなときは,ffillメソッドを使いましょう.
まず飛び飛びのデータとは,以下のようなデータです.

obj3 = pd.Series([5101, 5260, 5308, 5275, 5290], index=[0, 1, 3, 5, 6])
obj3
0    5101
1    5260
3    5308
5    5275
6    5290
dtype: int64

こんな感じで2と4のデータが飛んでいたとします.
これを補いつつ,流れを崩さない?ようなデータを挿入しましょう.

obj3.reindex(range(7), method="ffill")
0    5101
1    5260
2    5260
3    5308
4    5308
5    5275
6    5290
dtype: int64

このようになりました!
2と4にはそれぞれの前のインデックス1と3と同じデータが入りました.

これだけの配列では,あまり意味をなさないかもしれませんが,すごい長いデータや細かく取ったデータが膨大なときとか,影響が小さくて済みそうですし,簡単にデータを補えそうですよね.
(データがないなどの時はいろんな処理をする中でエラーの原因となりますので...)

何言ってるかわからないぞ!ってなった人は,こんなんあるんだ程度でおぼえてくださいな.

これとは逆にbfillというのもあります.

obj3.reindex(range(7), method="bfill")

0    5101
1    5260
2    5308
3    5308
4    5275
5    5275
6    5290
dtype: int64

こんな感じで,2と4にはそれぞれの後のインデックス3と5のインデックスのデータが挿入されています.

これでffillとbfillは完璧ですね!!

行,列の変更

これまで,シリーズについて.reindexを行ってきましたが,データフレームについても同様に扱うことができます.
まず,データフレームのデータを作りましょう.

frame = pd.DataFrame(np.arange(9).reshape((3, 3)),
                    index=["data1", "data4", "data5"],
                    columns=["Otsu", "Kusatsu", "Hikone"])
frame
	Otsu	Kusatsu	Hikone
data1	0	1	2
data4	3	4	5
data5	6	7	8

このデータに対して.reindexの引数にシーケンス,つまり,インデックスのみの配列を渡してみましょう.

frame.reindex(["data1", "data2", "data3", "data4", "data5"])

        Otsu	Kusatsu	Hikone
data1	0.0	1.0	2.0
data2	NaN	NaN	NaN
data3	NaN	NaN	NaN
data4	3.0	4.0	5.0
data5	6.0	7.0	8.0

上記のようにデータを持っていないインデックスを渡すと,NaN値が挿入されます.
シリーズでは一列のデータだけでしたが,データフレームは複数行あるので,この操作を列に対して行うこともできます.

city = ["Hikone", "Koka", "Otsu", "Nagahama"]
frame.reindex(columns=city)
	Hikone	Koka	Otsu	Nagahama
data1	2	NaN	0	NaN
data4	5	NaN	3	NaN
data5	8	NaN	6	NaN

このように元のデータフレームと異なる列の順番,新しいインデックスの挿入ができました.

行と列の両方を変更したいときは以下のようにします.

frame.reindex(["data1", "data2", "data3", "data4", "data5"], columns=city)
        Hikone	Koka	Otsu	Nagahama
data1	2.0	NaN	0.0	NaN
data2	NaN	NaN	NaN	NaN
data3	NaN	NaN	NaN	NaN
data4	5.0	NaN	3.0	NaN
data5	8.0	NaN	6.0	NaN

行と列の両方変えることができましたね.

このように.reindexは新しいインデックスに従って,新しいデータを生成することができます.

まとめ

今回は,pandasにおける.reindexメソッドについて紹介しました.
詳しい引数については今後,便利だと思ったときに紹介していきたいと思います.

また,もっと詳しく学びたいという方には,「Pythonによるデータ分析入門」をおすすめします.
ネットで検索して断片的に知識を得るよりも,この本を使って体系的に学ぶことをおすすめします.

では,楽しく明るい未来のために一緒に頑張っていきましょう!!

コメント

タイトルとURLをコピーしました