pandasによるStackingとUnstacking

pandasによるpivot 〜 複数行に渡って重複しているデータを、重複しているデータ毎に集計する」の続き。

pandas.DataFrame.stackを使うと列から行へのpivotができる。
unstackはその逆。

前回使用したコードにstack部分を追加する。

#coding:utf-8
import numpy as np
import pandas as pd
import datetime
import pandas_datareader.data as pdd

# 期間設定
date_from = datetime.date(2016, 9, 24)

# 株価データ取得
aapl = pdd.DataReader('AAPL', "yahoo", date_from, date_to)
msft = pdd.DataReader('MSFT', "yahoo", date_from, date_to)

# 「Symbol」という名前の列を追加
aapl.insert(0, 'Symbol', 'AAPL')
msft.insert(0, 'Symbol', 'MSFT')

# 2つのデータフレームを結合
AAPL_MSFT = pd.concat([msft, aapl]).sort_index()

# indexをresetしてDateをカラムデータと認識させる
AAPL_MSFT = AAPL_MSFT.reset_index()

# pivot集計する
adjClose = AAPL_MSFT.pivot(
    index='Date',
    columns='Symbol',
    values='Adj Close'
)

print "# 元データ"
print "print adjClose"
print adjClose

# stackを実行する
stackedAdjClose = adjClose.stack()

print "# stackを実行する"
print "print stackedAdjClose"
print stackedAdjClose

# unstackにより元に戻す
unStackedAdjClose = stackedAdjClose.unstack()
print "# unstackにより元に戻す"
print "print unStackedAdjClose"
print unStackedAdjClose

実行結果は次。

# 元データ
print adjClose
Symbol AAPL MSFT
Date
2016-09-26 112.303406 56.518189
2016-09-27 112.512333 57.561143
2016-09-28 113.367940 57.640604
2016-09-29 111.606985 57.014834
2016-09-30 112.472544 57.213489
2016-10-03 111.945245 57.034697
2016-10-04 112.422796 56.855908
2016-10-05 112.472544 57.253222
2016-10-06 113.308249 57.352553
# stackを実行する
print stackedAdjClose
Date Symbol
2016-09-26 AAPL 112.303406
MSFT 56.518189
2016-09-27 AAPL 112.512333
MSFT 57.561143
2016-09-28 AAPL 113.367940
MSFT 57.640604
2016-09-29 AAPL 111.606985
MSFT 57.014834
2016-09-30 AAPL 112.472544
MSFT 57.213489
2016-10-03 AAPL 111.945245
MSFT 57.034697
2016-10-04 AAPL 112.422796
MSFT 56.855908
2016-10-05 AAPL 112.472544
MSFT 57.253222
2016-10-06 AAPL 113.308249
MSFT 57.352553
dtype: float64
# unstackにより元に戻す
print unStackedAdjClose
Symbol AAPL MSFT
Date
2016-09-26 112.303406 56.518189
2016-09-27 112.512333 57.561143
2016-09-28 113.367940 57.640604
2016-09-29 111.606985 57.014834
2016-09-30 112.472544 57.213489
2016-10-03 111.945245 57.034697
2016-10-04 112.422796 56.855908
2016-10-05 112.472544 57.253222
2016-10-06 113.308249 57.352553