2015年12月26日

pandasでカラムの値を列に変換する

こんなtsvがあったとする。

sectiondatesalescost
A2015122010080
A201512219090
A20151222150110
B20151220180140
B20151221130200
B2015122290100
C201512201250800
C20151221905850
C201512221000700

A〜Cの3つの部門の、それぞれ2015/12/20〜2015/12/22の売上とコストが書いてあるようなイメージ。

これを読み込んで、日付をカラムにしたいと考えた。具体的にはこういうイメージ。

sectionsalescost
201512202015122120151222201512202015122120151222
A100901508090110
B18013090140200100
C12509051000800850700

pivot_tableの3つ目の引数(columns)に値を渡せばできるらしい。下記はsectionをindexとし、dateがカラムになるように指定している。

import pandas as pd
df = pd.read_csv('tmp.tsv', sep='\t')
df.pivot_table(['sales', 'cost'], index='section', columns='date')

  #=>            sales                       cost                  
  #=> date    20151220 20151221 20151222 20151220 20151221 20151222
  #=> section                                                      
  #=> A            100       90      150       80       90      110
  #=> B            180      130       90      140      200      100
  #=> C           1250      905     1000      800      850      700

これで日付ごとの情報が扱いやすくなった。

# 20151220のsalesを見る
df.sales[20151220]

  #=> section
  #=> A     100
  #=> B     180
  #=> C    1250

20151221の前日比を確認してみる。(これがやりたかったから調べた)

df.sales[20151220] / df.sales[20151221]

  #=> section
  #=> A    1.111111
  #=> B    1.384615
  #=> C    1.381215