Rもたいして使いこなせてないのにPythonの勉強を始めてみました。色々と素晴らしいチュートリアルはありそうですが、目移りしてしまうので公式チュートリアルを拾い読みしていきます。
NumPyが終わってPandasに入っています。導入版(Intro to pandas)・簡易版(10 minutes to pandas)は物足りなず、本格版(User guideのIntro to data structures以降)は読みきれなかったので、チートシート(PDF)を中心に読んでいきます。
前回:
今回はデータの縦横変形です。
横型データ・縦型データとは
同一対象者に対して複数回測定が行われた場合、データを保持する方法が2種類あります。 例えば、A, B, Cの3人に対して1990年と2000年にある項目を測定したデータシートを考えてみます。
横型データは、下のようにそれぞれの人について測定値を横に並べたデータです。よく見かける1行=1対象者の構造になっています。「Wide型」とか「横持ち」などと表現されることもあります。
これに対して縦型データは、それぞれの人について測定値を縦に並べたデータです。「Long型」とか「縦持ち」と表現されることがあります。
縦型データでは、値を格納する変数とその測定の属性(ここでは年)を格納する変数のペアとしてデータを保持します。これに加え、対象者を識別する変数(=ID)があり、同一対象者のデータはこれを元に関連づけられます。横型データが1行=1対象者であったのに対し、縦型データでは1行=1観察単位という構造になっています。
Pandasライブラリを読み込んで、サンプルデータを用意しておきます。
import pandas as pd df_wide = pd.DataFrame( {"patient":["A","B","C"], "time1":[10,20,30], "time2":[40,50,60]}, )
df_wide # 出力: patient time1 time2 0 A 10 40 1 B 20 50 2 C 30 60
横型を縦型に変形する
.melt()
というメソッドを使います。指定する主な引数は今のとおり。
id_vars
:縦変換しない変数value_vars
:縦型に変換したい変数var_name
:ラベルを格納する列につける名前value_name
:値を格納する列につける名前
df_long = df_wide.melt( id_vars = "patient", value_vars = ["time1","time2"], var_name = "timing", value_name ="lab" )
df_long # 出力: patient timing lab 0 A time1 10 1 B time1 20 2 C time1 30 3 A time2 40 4 B time2 50 5 C time2 60
縦型を横型に変形する
.pivot()
というメソッドを使って、先程作成したデータ(df_long
)を再度横型にしてみます。主な引数は以下のとおり。
index
:新しいデータフレームのインデックス名に使用する変数columns
:横型に展開した部分の列名に使う変数values
:横型に展開した部分の値に使う変数
df_rewide = df_long.pivot( index = "patient", columns = "timing", values = "lab" )
df_rewide # 出力: timing time1 time2 patient A 10 40 B 20 50 C 30 60
インデックスの階層構造を解きたいときは、.reset_index()
を使います。
df_rewide.reset_index() # 出力: timing patient time1 time2 0 A 10 40 1 B 20 50 2 C 30 60
おわりに
今回学んだこと:
- データの縦横変形
チュートリアルは読んだけど取り上げなかったもの:
- 今回はありません。
次回:
(未作成)