Python

Python初心者向け:stack()/unstack()で行と列を自由に入れ替える

スポンサーリンク


▶ 対数変換して相関をみたり可視化する方法は以下をご覧ください。

はじめに

今回はpandasのstack()/unstack()メソッドを扱うことにします。stackは「積む」という意味ですね。stack()/unstack()は、積んだり崩したりするメソッドです。stackは列から行へのピボットと説明されることが多いですが、「行方向に積む」ということなんでしょうね。逆に、unstackは「行方向に崩す」ということですね。

データを集計していて行と列を入れ替えたいときがありますよね。今回は、そんなときに使うstack/unstackを整理しましょう。

pandasにはSeriesとDataFrameというデータ構造があります。

 Series はリストのように順序を持った一次元のデータ列と、そのデータが何かを示す見出しを格納するオブジェクトです。pandas でよく使われるデータ構造として1次元の Series(シリーズ)、2次元の DataFrame(データフレーム)があります。

https://docs.pyq.jp/python/pydata/pandas/series.html?highlight=dataframe

まずはSerisからみていきましょう。

unstack()

Seriesは1次元のデータ構造なので「行方向に積む」メソッドであるstack()メソッドはありません。unstack()がどういう操作なのか、さっそく試してみましょう。

# ライブラリのインポート
import pandas as pd
 
# サンプルデータの作成    
animals = pd.Series([1,2,3,4,5],
                    index=[['ズーラシア','ズーラシア','ズーラシア','旭山動物園','旭山動物園'],
                           ['らくだ','らいおん','ぺんぎん','らくだ','ぺんぎん']])
animals.unstack()

このように階層型インデックスのSeriesのインデックスが列に移動して表形式になります。defaultでは内側のインデックスが列に移動しますが、これを指定することもできます。

animals.unstack(level=0)

stack()

次にstack()メソッドです。こちらはDataFrameにのみ適用できます。こちらもさっそく試してみましょう。

df_animals=animals.unstack()
df_animals
df_animals.stack()

列にあったどうぶつたちの名前が行方向に移動して、階層型インデックスのシリーズになります。

stack()とunstack()を組み合わせると、好きなように変形させることができます。たとえば、df_animalsの行と列を入れ替えたければ、次のようにします。

df_animals.stack().unstack(0)

これは、まずstack()で動物たちの名前が行に移動して階層型インデックスになります。このときlevel=0が動物園名、level=1が動物たちの名前となっています。この階層型インデックスをもつシリーズで、level=0のインデックスを列に移動させるためにunstack(0)としています。引数名levelは省略することができます。

スポンサーリンク

まとめ

いかがでしょうか?データフレームの行と列を入れかえたいときってありますよね。stack/unstackで自由自在に入れ替えることができるようになりました。

▶ データフレームから自由にデータの抽出をしましょう。条件に合ったデータを抽出する方法は以下の記事を参考にしてください。

▶ 不均衡データを扱う場合は、サンプリングでデータの均衡化をはかります。以下の記事をどうぞ。

コメント

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