ねこすたっと

ねこの気持ちと統計について悩む筆者の備忘録的ページ。

チュートリアル拾い読み (10):Pandas公式チュートリアル (5/7) [Python]

Rもたいして使いこなせてないのにPythonの勉強を始めてみました。色々と素晴らしいチュートリアルはありそうですが、目移りしてしまうので公式チュートリアルを拾い読みしていきます。

NumPyが終わってPandasに入っています。導入版(Intro to pandas)・簡易版(10 minutes to pandas)は物足りなず、本格版(User guideのIntro to data structures以降)は読みきれなかったので、チートシート(PDF)を中心に読んでいきます。

前回:

necostat.hatenablog.jp

今回はデータの縦横変形です。

横型データ・縦型データとは

同一対象者に対して複数回測定が行われた場合、データを保持する方法が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

おわりに

今回学んだこと:

  • データの縦横変形

チュートリアルは読んだけど取り上げなかったもの:

  • 今回はありません。

次回:

(未作成)