DataFrame を横方向に groupby ー Python

DataFrame の groupby は、縦方向にも横方向にもグルーピングできます。

groupbyは縦方向にも横方向にも可能

SQL からの連想で縦方向の groupby はイメージしやすいですが、横方向はピンとこなかったりします。

ということで、ここでは、横方向の groupby に絞ってみていきます。

グループ化のキーは列名

グループ化されるのは「列名」が同じ列です。上の図(右側)でいうと、緑の列、黄色の列にそれぞれ同じ名前が付いていると考えてください。

実際のサンプルで試してみます。列名が重複する次のようなデータがあったとして

axis=1 で groupby をかけると bb の2列が集約されます。

集約された結果の sum や mean で、bb 2列分の集計が行われます。

オプションが2つ出てきますが

  • level オプションは、列が階層化されている場合に 0、1 、2 と指定します。この例では階層化がされていないので 0 固定です。
  • axis=1 で「横方向」を指示しています。

列が階層化されている場合

国語と数学のテスト結果があるとします。
テストは、中間テストと期末テストの2回です。

列が

  • 国語(Language)、数学(Math)
  • 中間テスト(test1)、期末テスト(test2)

の2階層になっています。

教科で groupby

教科でグルーピングし、平均点を確認してみます。

集約キーは level オプションで指定、上側の列なら 0、下側の列なら 1 です。
教科は上側なので 0 を指定し

できました。

キーを変えてみる

中間テスト、期末テストで集計したければ level オプション を 1 にします。

groupby を使わずに

実は、上の処理は groupby を使わずもっと簡単に記述できます。

mean() にオプションを指定するだけです。

内部では groupby が動いているらしいのですが(参考:pythonによるデータ分析入門 P173)、ソース上に groupby は現れません。こちらのほうが見た目はすっきりします。ただ、知らない人が見たら何を平均しているのか判りづらいかもしれません。

階層が深い場合

列が3重、4重に階層化されている場合、 level オプションを配列で指定できます。

コメントはお気軽に