【Python】蛇使いへの道 (6) Pandasを操る

Pythonを使ったデータサイエンティストになるための修行です。
ついに３種の神器のひとつPandasをやっていきましょう。

PandasはPythonの超絶最強データ解析用パッケージです。
Excelでできることはなんでもできるので非常に便利。（Excelにできないこともできる）
numpyやmatplotlibなどとの相性も抜群でシームレスに利用できる。


Pandasを使ったPythonプログラムの実行は以下で説明しているIPython Notebookを使うのが良いと思います。
**PREV** →[【Python】蛇使いへの道 (5) Matplotlibと戯れる](http://qiita.com/Morinikki/items/f44cdc6d50c536b8fc9e)
**NEXT** → Pandasの応用(できるだけ早く)

こんな感じでDataFrameやグラフなどをキレイに可視化してくれます。すごいね。
![d609fdbf3aad58d028c32c82514073a0.png](https://qiita-image-store.s3.amazonaws.com/0/99505/92a5fded-2602-f0d9-3df7-65f2bd6480ad.png)




# Pandasのデータ構造

Pandasには3つのデータ構造があります。

- 1次元配列: Series
- 2次元配列: DataFrame
- 3次元配列: Panel

これらはNumpyのarrayから生成してみましょう。

## Seriesの例 (1D)


```python:Python
import numpy as np
import pandas as pd
```


```python:Python
# Series
a1 = np.arange(2)
idx = pd.Index(['A', 'B'], name = 'index')
series = pd.Series(a1, index=idx)
series
```




    index
    A    0
    B    1
    dtype: int64



# DataFrameの例 (2D)


```python:Python
# DataFrame
a2 = np.arange(4).reshape(2, 2)
col = pd.Index(['a', 'b'], name= 'column')
df = pd.DataFrame(a2, index=idx, columns=col)
df
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th>column</th>
      <th>a</th>
      <th>b</th>
    </tr>
    <tr>
      <th>index</th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>0</td>
      <td>1</td>
    </tr>
    <tr>
      <th>B</th>
      <td>2</td>
      <td>3</td>
    </tr>
  </tbody>
</table>
</div>



Panelの例 (3D)


```python:Python
a3 = np.arange(8).reshape(2,2,2)
itm = pd.Index(['p', 'q'], name='item')
panel = pd.Panel(a3, items=itm, major_axis=idx, minor_axis=col)
panel['p']
```




<table der="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th>column</th>
      <th>a</th>
      <th>b</th>
    </tr>
    <tr>
      <th>index</th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>0</td>
      <td>1</td>
    </tr>
    <tr>
      <th>B</th>
      <td>2</td>
      <td>3</td>
    </tr>
  </tbody>
</table>



```python:Python
panel['q']
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th>column</th>
      <th>a</th>
      <th>b</th>
    </tr>
    <tr>
      <th>index</th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>4</td>
      <td>5</td>
    </tr>
    <tr>
      <th>B</th>
      <td>6</td>
      <td>7</td>
    </tr>
  </tbody>
</table>
</div>



## 2重indexを持つSeriesの例 (実質2D)


```python:Python
a1=np.arange(4)
idx = pd.MultiIndex.from_product([['A','B'],['a','b']], names=('i','j'))
series2 = pd.Series(a1, index=idx)
series2

# 軸の多重度が3以上の場合でもfrom_productは使用できる。
# pd.MultiIndex.from_product([['A', 'B'],['a', 'b'],['1', '2']], names=('i', 'j', 'k'))
```




    i  j
    A  a    0
       b    1
    B  a    2
       b    3
    dtype: int64



## 2重indexを持つDataFrameの例 (実質4D)


```python:Python
a2 = np.arange(16) .reshape(4,4)
idx = pd.MultiIndex.from_product( [['A','B'],['a','b']], names=('i','j'))
col = pd.MultiIndex.from_product( [['C','D'],['c','d']], names=('k','l'))
df = pd.DataFrame(a2, index=idx, columns=col)
df
```




<div>
<table class="dataframe">
  <thead>
    <tr>
      <th></th>
      <th>k</th>
      <th colspan="2" halign="left">C</th>
      <th colspan="2" halign="left">D</th>
    </tr>
    <tr>
      <th></th>
      <th>l</th>
      <th>c</th>
      <th>d</th>
      <th>c</th>
      <th>d</th>
    </tr>
    <tr>
      <th>i</th>
      <th>j</th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="2" valign="top">A</th>
      <th>a</th>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <th>b</th>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
    </tr>
    <tr>
      <th rowspan="2" valign="top">B</th>
      <th>a</th>
      <td>8</td>
      <td>9</td>
      <td>10</td>
      <td>11</td>
    </tr>
    <tr>
      <th>b</th>
      <td>12</td>
      <td>13</td>
      <td>14</td>
      <td>15</td>
    </tr>
  </tbody>
</table>
</div>



今回は省略しますがPanelも同じように多重indexをもたせることができます。

# データへのアクセス方法 (Indexing)

PandasとNumpyの大きな違いはPandasではNumpyのindex概念が高機能化しています。
先程の２次元配列をNumpyとPandasのDataFrameで比較してみます。


```python:Python
a2 = np.arange(4).reshape(2, 2)
a2
```




    array([[0, 1],
           [2, 3]])




```python:Python
idx = pd.Index(['A', 'B'], name='index')
col = pd.Index(['a', 'b'], name='column')
df = pd.DataFrame(a2, index=idx, columns=col)
df
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th>column</th>
      <th>a</th>
      <th>b</th>
    </tr>
    <tr>
      <th>index</th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>0</td>
      <td>1</td>
    </tr>
    <tr>
      <th>B</th>
      <td>2</td>
      <td>3</td>
    </tr>
  </tbody>
</table>
</div>



行にそれぞれA, B、列にa, bというラベルを付けており、Pandasではこれをindexとして利用することができます。
これは**label-based index**と呼びます。
これに対してNumpyで使用される０から始まる整数のindexを**position-based index**と呼びます。
Pandasではこれら両方を利用可能です。


```python:Python
a2[1, 1]
```




    3




```python:Python
df.ix[1, 1]
```




    3




```python:Python
df.ix['B', 'b']
```




    3



**label-based index**はdictのkey的であり、**position-based index**はlistのindex的であるため、Pandasはdictとlistの両方の性質を兼ね備えていると考えることもできます。
なので、もちろんNumpyと同じようにslice, fancy indexing, boolean indexingも可能です。

## slice


```python:Python
df = pd.DataFrame( np.arange(16).reshape(4, 4), index=list('ABCD'),columns=list('abcd'))
df
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
      <th>c</th>
      <th>d</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <th>B</th>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
    </tr>
    <tr>
      <th>C</th>
      <td>8</td>
      <td>9</td>
      <td>10</td>
      <td>11</td>
    </tr>
    <tr>
      <th>D</th>
      <td>12</td>
      <td>13</td>
      <td>14</td>
      <td>15</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
# 第１行以上, 第３行未満
df.ix[1:3]
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
      <th>c</th>
      <th>d</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>B</th>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
    </tr>
    <tr>
      <th>C</th>
      <td>8</td>
      <td>9</td>
      <td>10</td>
      <td>11</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
# A行以上, C行以下
# label-based indexの場合は未満でなく以下
df.ix['A' : 'C']
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
      <th>c</th>
      <th>d</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <th>B</th>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
    </tr>
    <tr>
      <th>C</th>
      <td>8</td>
      <td>9</td>
      <td>10</td>
      <td>11</td>
    </tr>
  </tbody>
</table>
</div>



## fancy indexing


```python:Python
# 複数行指定
df.ix[['A', 'B', 'D']]
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
      <th>c</th>
      <th>d</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <th>B</th>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
    </tr>
    <tr>
      <th>D</th>
      <td>12</td>
      <td>13</td>
      <td>14</td>
      <td>15</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
# 複数列指定
df[[ 'b', 'd']]
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>b</th>
      <th>d</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>1</td>
      <td>3</td>
    </tr>
    <tr>
      <th>B</th>
      <td>5</td>
      <td>7</td>
    </tr>
    <tr>
      <th>C</th>
      <td>9</td>
      <td>11</td>
    </tr>
    <tr>
      <th>D</th>
      <td>13</td>
      <td>15</td>
    </tr>
  </tbody>
</table>
</div>



## boolean indexing


```python:Python
# Trueである行を参照
df.ix[[True, False, True]]
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
      <th>c</th>
      <th>d</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <th>C</th>
      <td>8</td>
      <td>9</td>
      <td>10</td>
      <td>11</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
# Trueである列を参照
df.ix[:,[True, False, True]]
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>c</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>0</td>
      <td>2</td>
    </tr>
    <tr>
      <th>B</th>
      <td>4</td>
      <td>6</td>
    </tr>
    <tr>
      <th>C</th>
      <td>8</td>
      <td>10</td>
    </tr>
    <tr>
      <th>D</th>
      <td>12</td>
      <td>14</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
# a値の2倍がc値より大きい行を参照
df.ix[df['a']*2 > df['c']]
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
      <th>c</th>
      <th>d</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>B</th>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
    </tr>
    <tr>
      <th>C</th>
      <td>8</td>
      <td>9</td>
      <td>10</td>
      <td>11</td>
    </tr>
    <tr>
      <th>D</th>
      <td>12</td>
      <td>13</td>
      <td>14</td>
      <td>15</td>
    </tr>
  </tbody>
</table>
</div>



# 軸およびindexの操作

Pandasを使う上で重要な軸の入れ替え、移動、indexのリネーム、indexのソートなどを紹介します。

## 軸の入れ替え (swapaxes)


```python:Python
a2 = np.arange(4) .reshape(2, 2)
idx = pd.Index(['A', 'B'], name='index')
col = pd.Index(['a', 'b'], name='column')
df = pd.DataFrame(a2, index=idx,columns=col)
df
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th>column</th>
      <th>a</th>
      <th>b</th>
    </tr>
    <tr>
      <th>index</th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>0</td>
      <td>1</td>
    </tr>
    <tr>
      <th>B</th>
      <td>2</td>
      <td>3</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
# 第0軸(行)と 第1軸(列)を入れ替える
df.swapaxes(0, 1)
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th>index</th>
      <th>A</th>
      <th>B</th>
    </tr>
    <tr>
      <th>column</th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>a</th>
      <td>0</td>
      <td>2</td>
    </tr>
    <tr>
      <th>b</th>
      <td>1</td>
      <td>3</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
# 2次元の場合は転置(T)しても同じ
df.T # transpose()の省略形
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th>index</th>
      <th>A</th>
      <th>B</th>
    </tr>
    <tr>
      <th>column</th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>a</th>
      <td>0</td>
      <td>2</td>
    </tr>
    <tr>
      <th>b</th>
      <td>1</td>
      <td>3</td>
    </tr>
  </tbody>
</table>
</div>



##  軸の移動 (stack / unstack)


```python:Python
# 列が、行側に移動
df.stack()
```




    index  column
    A      a         0
           b         1
    B      a         2
           b         3
    dtype: int64




```python:Python
# 行が、列側に移動
df.unstack()
```




    column  index
    a       A        0
            B        2
    b       A        1
            B        3
    dtype: int64




```python:Python
#stack()とunstack()は逆操作なので、この2つの操作を繰り返すと元に戻る
df.stack().unstack()
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th>column</th>
      <th>a</th>
      <th>b</th>
    </tr>
    <tr>
      <th>index</th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>0</td>
      <td>1</td>
    </tr>
    <tr>
      <th>B</th>
      <td>2</td>
      <td>3</td>
    </tr>
  </tbody>
</table>
</div>



行が列側に移動すると、列が2重indexで表現されます。
(多重でない)DataFrameをstack() あるいは unstack()すると、 どちらも出力はSeriesとなります。

##  多重軸の入れ替え (swapaxes)


```python:Python
a2 = np.arange(64).reshape(8,8)
idx = pd.MultiIndex.from_product( [['A','B'],['C','D'],['E','F']],names=list('ijk'))
col = pd.MultiIndex.from_product([['a','b'],['c','d'],['e','f']],names=list('xyz'))
df = pd.DataFrame(a2, index=idx,columns=col)
df
```




<div>
<table class="dataframe">
  <thead>
    <tr>
      <th></th>
      <th></th>
      <th>x</th>
      <th colspan="4" halign="left">a</th>
      <th colspan="4" halign="left">b</th>
    </tr>
    <tr>
      <th></th>
      <th></th>
      <th>y</th>
      <th colspan="2" halign="left">c</th>
      <th colspan="2" halign="left">d</th>
      <th colspan="2" halign="left">c</th>
      <th colspan="2" halign="left">d</th>
    </tr>
    <tr>
      <th></th>
      <th></th>
      <th>z</th>
      <th>e</th>
      <th>f</th>
      <th>e</th>
      <th>f</th>
      <th>e</th>
      <th>f</th>
      <th>e</th>
      <th>f</th>
    </tr>
    <tr>
      <th>i</th>
      <th>j</th>
      <th>k</th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="4" valign="top">A</th>
      <th rowspan="2" valign="top">C</th>
      <th>E</th>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
    </tr>
    <tr>
      <th>F</th>
      <td>8</td>
      <td>9</td>
      <td>10</td>
      <td>11</td>
      <td>12</td>
      <td>13</td>
      <td>14</td>
      <td>15</td>
    </tr>
    <tr>
      <th rowspan="2" valign="top">D</th>
      <th>E</th>
      <td>16</td>
      <td>17</td>
      <td>18</td>
      <td>19</td>
      <td>20</td>
      <td>21</td>
      <td>22</td>
      <td>23</td>
    </tr>
    <tr>
      <th>F</th>
      <td>24</td>
      <td>25</td>
      <td>26</td>
      <td>27</td>
      <td>28</td>
      <td>29</td>
      <td>30</td>
      <td>31</td>
    </tr>
    <tr>
      <th rowspan="4" valign="top">B</th>
      <th rowspan="2" valign="top">C</th>
      <th>E</th>
      <td>32</td>
      <td>33</td>
      <td>34</td>
      <td>35</td>
      <td>36</td>
      <td>37</td>
      <td>38</td>
      <td>39</td>
    </tr>
    <tr>
      <th>F</th>
      <td>40</td>
      <td>41</td>
      <td>42</td>
      <td>43</td>
      <td>44</td>
      <td>45</td>
      <td>46</td>
      <td>47</td>
    </tr>
    <tr>
      <th rowspan="2" valign="top">D</th>
      <th>E</th>
      <td>48</td>
      <td>49</td>
      <td>50</td>
      <td>51</td>
      <td>52</td>
      <td>53</td>
      <td>54</td>
      <td>55</td>
    </tr>
    <tr>
      <th>F</th>
      <td>56</td>
      <td>57</td>
      <td>58</td>
      <td>59</td>
      <td>60</td>
      <td>61</td>
      <td>62</td>
      <td>63</td>
    </tr>
  </tbody>
</table>
</div>



これは各軸ともに3重(3階層)になっている例ですが、swapaxes()では、全階層まるごと入れ替えが行なわれます。


```python:Python
df.swapaxes(0,1)
```




<div>
<table class="dataframe">
  <thead>
    <tr>
      <th></th>
      <th></th>
      <th>i</th>
      <th colspan="4" halign="left">A</th>
      <th colspan="4" halign="left">B</th>
    </tr>
    <tr>
      <th></th>
      <th></th>
      <th>j</th>
      <th colspan="2" halign="left">C</th>
      <th colspan="2" halign="left">D</th>
      <th colspan="2" halign="left">C</th>
      <th colspan="2" halign="left">D</th>
    </tr>
    <tr>
      <th></th>
      <th></th>
      <th>k</th>
      <th>E</th>
      <th>F</th>
      <th>E</th>
      <th>F</th>
      <th>E</th>
      <th>F</th>
      <th>E</th>
      <th>F</th>
    </tr>
    <tr>
      <th>x</th>
      <th>y</th>
      <th>z</th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="4" valign="top">a</th>
      <th rowspan="2" valign="top">c</th>
      <th>e</th>
      <td>0</td>
      <td>8</td>
      <td>16</td>
      <td>24</td>
      <td>32</td>
      <td>40</td>
      <td>48</td>
      <td>56</td>
    </tr>
    <tr>
      <th>f</th>
      <td>1</td>
      <td>9</td>
      <td>17</td>
      <td>25</td>
      <td>33</td>
      <td>41</td>
      <td>49</td>
      <td>57</td>
    </tr>
    <tr>
      <th rowspan="2" valign="top">d</th>
      <th>e</th>
      <td>2</td>
      <td>10</td>
      <td>18</td>
      <td>26</td>
      <td>34</td>
      <td>42</td>
      <td>50</td>
      <td>58</td>
    </tr>
    <tr>
      <th>f</th>
      <td>3</td>
      <td>11</td>
      <td>19</td>
      <td>27</td>
      <td>35</td>
      <td>43</td>
      <td>51</td>
      <td>59</td>
    </tr>
    <tr>
      <th rowspan="4" valign="top">b</th>
      <th rowspan="2" valign="top">c</th>
      <th>e</th>
      <td>4</td>
      <td>12</td>
      <td>20</td>
      <td>28</td>
      <td>36</td>
      <td>44</td>
      <td>52</td>
      <td>60</td>
    </tr>
    <tr>
      <th>f</th>
      <td>5</td>
      <td>13</td>
      <td>21</td>
      <td>29</td>
      <td>37</td>
      <td>45</td>
      <td>53</td>
      <td>61</td>
    </tr>
    <tr>
      <th rowspan="2" valign="top">d</th>
      <th>e</th>
      <td>6</td>
      <td>14</td>
      <td>22</td>
      <td>30</td>
      <td>38</td>
      <td>46</td>
      <td>54</td>
      <td>62</td>
    </tr>
    <tr>
      <th>f</th>
      <td>7</td>
      <td>15</td>
      <td>23</td>
      <td>31</td>
      <td>39</td>
      <td>47</td>
      <td>55</td>
      <td>63</td>
    </tr>
  </tbody>
</table>
</div>



## 多重軸の入れ替え (swaplevel / reorder_levels)


```python:Python
# 第0軸(行)の、第0階層(i)と第２階層(z)を入れ替え
df.reorder_levels([2, 1, 0])
# swaplevel(0, 2) または swaplevel('i', 'z')でも同じ
```




<div>
<table class="dataframe">
  <thead>
    <tr>
      <th></th>
      <th></th>
      <th>x</th>
      <th colspan="4" halign="left">a</th>
      <th colspan="4" halign="left">b</th>
    </tr>
    <tr>
      <th></th>
      <th></th>
      <th>y</th>
      <th colspan="2" halign="left">c</th>
      <th colspan="2" halign="left">d</th>
      <th colspan="2" halign="left">c</th>
      <th colspan="2" halign="left">d</th>
    </tr>
    <tr>
      <th></th>
      <th></th>
      <th>z</th>
      <th>e</th>
      <th>f</th>
      <th>e</th>
      <th>f</th>
      <th>e</th>
      <th>f</th>
      <th>e</th>
      <th>f</th>
    </tr>
    <tr>
      <th>k</th>
      <th>j</th>
      <th>i</th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>E</th>
      <th>C</th>
      <th>A</th>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
    </tr>
    <tr>
      <th>F</th>
      <th>C</th>
      <th>A</th>
      <td>8</td>
      <td>9</td>
      <td>10</td>
      <td>11</td>
      <td>12</td>
      <td>13</td>
      <td>14</td>
      <td>15</td>
    </tr>
    <tr>
      <th>E</th>
      <th>D</th>
      <th>A</th>
      <td>16</td>
      <td>17</td>
      <td>18</td>
      <td>19</td>
      <td>20</td>
      <td>21</td>
      <td>22</td>
      <td>23</td>
    </tr>
    <tr>
      <th>F</th>
      <th>D</th>
      <th>A</th>
      <td>24</td>
      <td>25</td>
      <td>26</td>
      <td>27</td>
      <td>28</td>
      <td>29</td>
      <td>30</td>
      <td>31</td>
    </tr>
    <tr>
      <th>E</th>
      <th>C</th>
      <th>B</th>
      <td>32</td>
      <td>33</td>
      <td>34</td>
      <td>35</td>
      <td>36</td>
      <td>37</td>
      <td>38</td>
      <td>39</td>
    </tr>
    <tr>
      <th>F</th>
      <th>C</th>
      <th>B</th>
      <td>40</td>
      <td>41</td>
      <td>42</td>
      <td>43</td>
      <td>44</td>
      <td>45</td>
      <td>46</td>
      <td>47</td>
    </tr>
    <tr>
      <th>E</th>
      <th>D</th>
      <th>B</th>
      <td>48</td>
      <td>49</td>
      <td>50</td>
      <td>51</td>
      <td>52</td>
      <td>53</td>
      <td>54</td>
      <td>55</td>
    </tr>
    <tr>
      <th>F</th>
      <th>D</th>
      <th>B</th>
      <td>56</td>
      <td>57</td>
      <td>58</td>
      <td>59</td>
      <td>60</td>
      <td>61</td>
      <td>62</td>
      <td>63</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
# 第1軸(列)の、第0階層(x)と第1階層(y)を 入れ替え
df.reorder_levels([1,0,2],axis=1)
# swaplevel(0, 1, axis=1) または swaplevel('i', 'j', axis=1)でも同じ
```




<div>
<table class="dataframe">
  <thead>
    <tr>
      <th></th>
      <th></th>
      <th>y</th>
      <th colspan="2" halign="left">c</th>
      <th colspan="2" halign="left">d</th>
      <th colspan="2" halign="left">c</th>
      <th colspan="2" halign="left">d</th>
    </tr>
    <tr>
      <th></th>
      <th></th>
      <th>x</th>
      <th colspan="2" halign="left">a</th>
      <th colspan="2" halign="left">a</th>
      <th colspan="2" halign="left">b</th>
      <th colspan="2" halign="left">b</th>
    </tr>
    <tr>
      <th></th>
      <th></th>
      <th>z</th>
      <th>e</th>
      <th>f</th>
      <th>e</th>
      <th>f</th>
      <th>e</th>
      <th>f</th>
      <th>e</th>
      <th>f</th>
    </tr>
    <tr>
      <th>i</th>
      <th>j</th>
      <th>k</th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="4" valign="top">A</th>
      <th rowspan="2" valign="top">C</th>
      <th>E</th>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
    </tr>
    <tr>
      <th>F</th>
      <td>8</td>
      <td>9</td>
      <td>10</td>
      <td>11</td>
      <td>12</td>
      <td>13</td>
      <td>14</td>
      <td>15</td>
    </tr>
    <tr>
      <th rowspan="2" valign="top">D</th>
      <th>E</th>
      <td>16</td>
      <td>17</td>
      <td>18</td>
      <td>19</td>
      <td>20</td>
      <td>21</td>
      <td>22</td>
      <td>23</td>
    </tr>
    <tr>
      <th>F</th>
      <td>24</td>
      <td>25</td>
      <td>26</td>
      <td>27</td>
      <td>28</td>
      <td>29</td>
      <td>30</td>
      <td>31</td>
    </tr>
    <tr>
      <th rowspan="4" valign="top">B</th>
      <th rowspan="2" valign="top">C</th>
      <th>E</th>
      <td>32</td>
      <td>33</td>
      <td>34</td>
      <td>35</td>
      <td>36</td>
      <td>37</td>
      <td>38</td>
      <td>39</td>
    </tr>
    <tr>
      <th>F</th>
      <td>40</td>
      <td>41</td>
      <td>42</td>
      <td>43</td>
      <td>44</td>
      <td>45</td>
      <td>46</td>
      <td>47</td>
    </tr>
    <tr>
      <th rowspan="2" valign="top">D</th>
      <th>E</th>
      <td>48</td>
      <td>49</td>
      <td>50</td>
      <td>51</td>
      <td>52</td>
      <td>53</td>
      <td>54</td>
      <td>55</td>
    </tr>
    <tr>
      <th>F</th>
      <td>56</td>
      <td>57</td>
      <td>58</td>
      <td>59</td>
      <td>60</td>
      <td>61</td>
      <td>62</td>
      <td>63</td>
    </tr>
  </tbody>
</table>
</div>



## 多重軸の移動 (stack / unstack)

stack()では列軸の最下level軸が、 行軸の最下level軸に移動します。


```python:Python
df.stack()
```




<div>
<table class="dataframe">
  <thead>
    <tr>
      <th></th>
      <th></th>
      <th></th>
      <th>x</th>
      <th colspan="2" halign="left">a</th>
      <th colspan="2" halign="left">b</th>
    </tr>
    <tr>
      <th></th>
      <th></th>
      <th></th>
      <th>y</th>
      <th>c</th>
      <th>d</th>
      <th>c</th>
      <th>d</th>
    </tr>
    <tr>
      <th>i</th>
      <th>j</th>
      <th>k</th>
      <th>z</th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="8" valign="top">A</th>
      <th rowspan="4" valign="top">C</th>
      <th rowspan="2" valign="top">E</th>
      <th>e</th>
      <td>0</td>
      <td>2</td>
      <td>4</td>
      <td>6</td>
    </tr>
    <tr>
      <th>f</th>
      <td>1</td>
      <td>3</td>
      <td>5</td>
      <td>7</td>
    </tr>
    <tr>
      <th rowspan="2" valign="top">F</th>
      <th>e</th>
      <td>8</td>
      <td>10</td>
      <td>12</td>
      <td>14</td>
    </tr>
    <tr>
      <th>f</th>
      <td>9</td>
      <td>11</td>
      <td>13</td>
      <td>15</td>
    </tr>
    <tr>
      <th rowspan="4" valign="top">D</th>
      <th rowspan="2" valign="top">E</th>
      <th>e</th>
      <td>16</td>
      <td>18</td>
      <td>20</td>
      <td>22</td>
    </tr>
    <tr>
      <th>f</th>
      <td>17</td>
      <td>19</td>
      <td>21</td>
      <td>23</td>
    </tr>
    <tr>
      <th rowspan="2" valign="top">F</th>
      <th>e</th>
      <td>24</td>
      <td>26</td>
      <td>28</td>
      <td>30</td>
    </tr>
    <tr>
      <th>f</th>
      <td>25</td>
      <td>27</td>
      <td>29</td>
      <td>31</td>
    </tr>
    <tr>
      <th rowspan="8" valign="top">B</th>
      <th rowspan="4" valign="top">C</th>
      <th rowspan="2" valign="top">E</th>
      <th>e</th>
      <td>32</td>
      <td>34</td>
      <td>36</td>
      <td>38</td>
    </tr>
    <tr>
      <th>f</th>
      <td>33</td>
      <td>35</td>
      <td>37</td>
      <td>39</td>
    </tr>
    <tr>
      <th rowspan="2" valign="top">F</th>
      <th>e</th>
      <td>40</td>
      <td>42</td>
      <td>44</td>
      <td>46</td>
    </tr>
    <tr>
      <th>f</th>
      <td>41</td>
      <td>43</td>
      <td>45</td>
      <td>47</td>
    </tr>
    <tr>
      <th rowspan="4" valign="top">D</th>
      <th rowspan="2" valign="top">E</th>
      <th>e</th>
      <td>48</td>
      <td>50</td>
      <td>52</td>
      <td>54</td>
    </tr>
    <tr>
      <th>f</th>
      <td>49</td>
      <td>51</td>
      <td>53</td>
      <td>55</td>
    </tr>
    <tr>
      <th rowspan="2" valign="top">F</th>
      <th>e</th>
      <td>56</td>
      <td>58</td>
      <td>60</td>
      <td>62</td>
    </tr>
    <tr>
      <th>f</th>
      <td>57</td>
      <td>59</td>
      <td>61</td>
      <td>63</td>
    </tr>
  </tbody>
</table>
</div>



unstack()では行軸の最下level軸が、 列軸の最下level軸に移動します。


```python:Python
df.unstack()
```




<div>
<table class="dataframe">
  <thead>
    <tr>
      <th></th>
      <th>x</th>
      <th colspan="8" halign="left">a</th>
      <th colspan="8" halign="left">b</th>
    </tr>
    <tr>
      <th></th>
      <th>y</th>
      <th colspan="4" halign="left">c</th>
      <th colspan="4" halign="left">d</th>
      <th colspan="4" halign="left">c</th>
      <th colspan="4" halign="left">d</th>
    </tr>
    <tr>
      <th></th>
      <th>z</th>
      <th colspan="2" halign="left">e</th>
      <th colspan="2" halign="left">f</th>
      <th colspan="2" halign="left">e</th>
      <th colspan="2" halign="left">f</th>
      <th colspan="2" halign="left">e</th>
      <th colspan="2" halign="left">f</th>
      <th colspan="2" halign="left">e</th>
      <th colspan="2" halign="left">f</th>
    </tr>
    <tr>
      <th></th>
      <th>k</th>
      <th>E</th>
      <th>F</th>
      <th>E</th>
      <th>F</th>
      <th>E</th>
      <th>F</th>
      <th>E</th>
      <th>F</th>
      <th>E</th>
      <th>F</th>
      <th>E</th>
      <th>F</th>
      <th>E</th>
      <th>F</th>
      <th>E</th>
      <th>F</th>
    </tr>
    <tr>
      <th>i</th>
      <th>j</th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="2" valign="top">A</th>
      <th>C</th>
      <td>0</td>
      <td>8</td>
      <td>1</td>
      <td>9</td>
      <td>2</td>
      <td>10</td>
      <td>3</td>
      <td>11</td>
      <td>4</td>
      <td>12</td>
      <td>5</td>
      <td>13</td>
      <td>6</td>
      <td>14</td>
      <td>7</td>
      <td>15</td>
    </tr>
    <tr>
      <th>D</th>
      <td>16</td>
      <td>24</td>
      <td>17</td>
      <td>25</td>
      <td>18</td>
      <td>26</td>
      <td>19</td>
      <td>27</td>
      <td>20</td>
      <td>28</td>
      <td>21</td>
      <td>29</td>
      <td>22</td>
      <td>30</td>
      <td>23</td>
      <td>31</td>
    </tr>
    <tr>
      <th rowspan="2" valign="top">B</th>
      <th>C</th>
      <td>32</td>
      <td>40</td>
      <td>33</td>
      <td>41</td>
      <td>34</td>
      <td>42</td>
      <td>35</td>
      <td>43</td>
      <td>36</td>
      <td>44</td>
      <td>37</td>
      <td>45</td>
      <td>38</td>
      <td>46</td>
      <td>39</td>
      <td>47</td>
    </tr>
    <tr>
      <th>D</th>
      <td>48</td>
      <td>56</td>
      <td>49</td>
      <td>57</td>
      <td>50</td>
      <td>58</td>
      <td>51</td>
      <td>59</td>
      <td>52</td>
      <td>60</td>
      <td>53</td>
      <td>61</td>
      <td>54</td>
      <td>62</td>
      <td>55</td>
      <td>63</td>
    </tr>
  </tbody>
</table>
</div>



## indexのrename


```python:Python
df = pd.DataFrame( [[90, 50], [60, 80]], index=['t', 'h'],columns=['m', 'e'])
df
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>m</th>
      <th>e</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>t</th>
      <td>90</td>
      <td>50</td>
    </tr>
    <tr>
      <th>h</th>
      <td>60</td>
      <td>80</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
df.index.name='名前'
df.columns.name='科目'
df.rename(index=dict(t='太郎', h='花子'), columns=dict(m='数学', e='英語'))
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th>科目</th>
      <th>数学</th>
      <th>英語</th>
    </tr>
    <tr>
      <th>名前</th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>太郎</th>
      <td>90</td>
      <td>50</td>
    </tr>
    <tr>
      <th>花子</th>
      <td>60</td>
      <td>80</td>
    </tr>
  </tbody>
</table>
</div>



## indexでのソート


```python:Python
df = pd.DataFrame (np.arange(9).reshape(3,3), index=['B','A','C'], columns=['c','b','a'])
df
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>c</th>
      <th>b</th>
      <th>a</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>B</th>
      <td>0</td>
      <td>1</td>
      <td>2</td>
    </tr>
    <tr>
      <th>A</th>
      <td>3</td>
      <td>4</td>
      <td>5</td>
    </tr>
    <tr>
      <th>C</th>
      <td>6</td>
      <td>7</td>
      <td>8</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
# 行を行index順にソート
df.sort_index(axis=0)
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>c</th>
      <th>b</th>
      <th>a</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>3</td>
      <td>4</td>
      <td>5</td>
    </tr>
    <tr>
      <th>B</th>
      <td>0</td>
      <td>1</td>
      <td>2</td>
    </tr>
    <tr>
      <th>C</th>
      <td>6</td>
      <td>7</td>
      <td>8</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
# 列を列index順でもソート
df.sort_index(axis=0).sort_index(axis=1)
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
      <th>c</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>5</td>
      <td>4</td>
      <td>3</td>
    </tr>
    <tr>
      <th>B</th>
      <td>2</td>
      <td>1</td>
      <td>0</td>
    </tr>
    <tr>
      <th>C</th>
      <td>8</td>
      <td>7</td>
      <td>6</td>
    </tr>
  </tbody>
</table>
</div>



# データの変換
##  Seriesのデータ変換


```python:Python
series=pd.Series([2, 3], index=list('ab'))
series
```




    a    2
    b    3
    dtype: int64




```python:Python
# Seriesの各値を2乗する
series ** 2
```




    a    4
    b    9
    dtype: int64




```python:Python
# mapで関数やdictをわたすこともできる
series.map(lambda x: x**2)
# series.map( {x:x**2 for x in range(3) })
```




    a    4
    b    9
    dtype: int64



## DataFrameのデータ変換


```python:Python
df = pd.DataFrame( [[2, 3], [4, 5]], index=list('AB'),columns=list('ab'))
df
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <th>B</th>
      <td>4</td>
      <td>5</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
# Seriesと同様
df ** 2
# df.map(lambda x: x**2)
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>4</td>
      <td>9</td>
    </tr>
    <tr>
      <th>B</th>
      <td>16</td>
      <td>25</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
# 関数(Series to scalar)を各列に適用する
# 次元が一つ下がり、結果はSeriesになる
df.apply(lambda c: c['A']*c['B'], axis=0)
```




    a     8
    b    15
    dtype: int64




```python:Python
# 関数(Series to Series)を各行に適用する
# 結果はDataFrame
df.apply(lambda r: pd.Series(dict(a=r['a']+r['b'], b=r['a']*r['b'])), axis=1)
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>5</td>
      <td>6</td>
    </tr>
    <tr>
      <th>B</th>
      <td>9</td>
      <td>20</td>
    </tr>
  </tbody>
</table>
</div>



# 連結 (concat) と結合 (merge)

Pandasでは複数のSeriesやDataFrameの連結、結合を行うことができます。

## Seriesの連結 (concat)
indexに重複があったとしてもそのまま結合されます。

```python:Python
ser1=pd.Series([1,2], index=list('ab'))
ser2=pd.Series([3,4], index=list('bc'))
pd.concat([ser1, ser2])
```





    a    1
    b    2
    b    3
    c    4
    dtype: int64




```python:Python
# indexをユニークにするときは、重複inexを除いておく
dif_idx = ser2.index.difference(ser1.index)
pd.concat([ser1, ser2[list(dif_idx)]])
```




    a    1
    b    2
    c    4
    dtype: int64



## DataFrameの連結 (concat)


```python:Python
df1 = pd.DataFrame([[1, 2], [3, 4]], index=list('AB'),columns=list('ab'))
df2 = pd.DataFrame([[5, 6], [7, 8]], index=list('CD'),columns=list('ab'))
df3 = pd.DataFrame([[5, 6], [7, 8]], index=list('AB'),columns=list('cd'))
```

```python:Python
df1
```



<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>1</td>
      <td>2</td>
    </tr>
    <tr>
      <th>B</th>
      <td>3</td>
      <td>4</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
df2
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>C</th>
      <td>5</td>
      <td>6</td>
    </tr>
    <tr>
      <th>D</th>
      <td>7</td>
      <td>8</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
df3
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>c</th>
      <th>d</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>5</td>
      <td>6</td>
    </tr>
    <tr>
      <th>B</th>
      <td>7</td>
      <td>8</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
# 第０軸(行)方向に積み上げる
pd.concat([df1, df2], axis=0)
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>1</td>
      <td>2</td>
    </tr>
    <tr>
      <th>B</th>
      <td>3</td>
      <td>4</td>
    </tr>
    <tr>
      <th>C</th>
      <td>5</td>
      <td>6</td>
    </tr>
    <tr>
      <th>D</th>
      <td>7</td>
      <td>8</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
# 第1軸(列)方向に積み上げる
pd.concat([df1, df3], axis=1)
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
      <th>c</th>
      <th>d</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>A</th>
      <td>1</td>
      <td>2</td>
      <td>5</td>
      <td>6</td>
    </tr>
    <tr>
      <th>B</th>
      <td>3</td>
      <td>4</td>
      <td>7</td>
      <td>8</td>
    </tr>
  </tbody>
</table>
</div>



## DataFrameの結合 (merge)


```python:Python
df1.index.name = df3.index.name = 'A'
df10 = df1.reset_index()
df30 = df3.reset_index()
```

```python:Python
df10
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>A</th>
      <th>a</th>
      <th>b</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>A</td>
      <td>1</td>
      <td>2</td>
    </tr>
    <tr>
      <th>1</th>
      <td>B</td>
      <td>3</td>
      <td>4</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
df30
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>A</th>
      <th>c</th>
      <th>d</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>A</td>
      <td>5</td>
      <td>6</td>
    </tr>
    <tr>
      <th>1</th>
      <td>B</td>
      <td>7</td>
      <td>8</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
# 列Aで結合
pd.merge(df10, df30, on='A')
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>A</th>
      <th>a</th>
      <th>b</th>
      <th>c</th>
      <th>d</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>A</td>
      <td>1</td>
      <td>2</td>
      <td>5</td>
      <td>6</td>
    </tr>
    <tr>
      <th>1</th>
      <td>B</td>
      <td>3</td>
      <td>4</td>
      <td>7</td>
      <td>8</td>
    </tr>
  </tbody>
</table>
</div>



onには結合に使用する列名を与えます。
複数指定可能でその場合はlistで与えます。
省略時には、2つDataFrameの共通列名が採用されます。
上の例では共通列名がAのみなので省略可能です。
mergeにおいては、index列は無視されるので注意が必要です。




# 各種ファイル形式の入出力

Pandasは色々な形式を入出力できます。


```python:Python
a2 = np.arange(16) .reshape(4,4)
idx = pd.MultiIndex.from_product( [['A','B'],['a','b']], names=('i','j'))
col = pd.MultiIndex.from_product( [['C','D'],['c','d']], names=('k','l'))
df = pd.DataFrame(a2, index=idx, columns=col)
df
```




<div>
<table class="dataframe">
  <thead>
    <tr>
      <th></th>
      <th>k</th>
      <th colspan="2" halign="left">C</th>
      <th colspan="2" halign="left">D</th>
    </tr>
    <tr>
      <th></th>
      <th>l</th>
      <th>c</th>
      <th>d</th>
      <th>c</th>
      <th>d</th>
    </tr>
    <tr>
      <th>i</th>
      <th>j</th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="2" valign="top">A</th>
      <th>a</th>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <th>b</th>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
    </tr>
    <tr>
      <th rowspan="2" valign="top">B</th>
      <th>a</th>
      <td>8</td>
      <td>9</td>
      <td>10</td>
      <td>11</td>
    </tr>
    <tr>
      <th>b</th>
      <td>12</td>
      <td>13</td>
      <td>14</td>
      <td>15</td>
    </tr>
  </tbody>
</table>
</div>



## ファイルの書き出し


```python:Python
# HTMLファイルへの出力
df.to_html('a2.html')
```

<img width="160" alt="32957e8792ba55f5f52df7d813f0003e.png" src="https://qiita-image-store.s3.amazonaws.com/0/99505/8ba98d1b-78e4-65a3-1911-bc56f9efc491.png">

```python:Python
# Excelファイルへの出力 (openpyxlが必要)
df.to_excel('a2.xlsx')
```

![179505962188cc349454e7a9480df3ca.png](https://qiita-image-store.s3.amazonaws.com/0/99505/6b6c3059-1e1e-36a5-df7c-21ca8166cc99.png)


## ファイルの読み込み

![fd422419ab28458aa3d221f2d2a4e358.png](https://qiita-image-store.s3.amazonaws.com/0/99505/ad70496d-78fe-676d-3190-8b8f85ec1d5b.png)


```python:Python
xl = pd.ExcelFile('test.xlsx')
# sheetの指定
df = xl.parse('Sheet1')
df
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>国語</th>
      <th>数学</th>
      <th>英語</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>太郎</th>
      <td>70</td>
      <td>80</td>
      <td>90</td>
    </tr>
    <tr>
      <th>花子</th>
      <td>90</td>
      <td>60</td>
      <td>70</td>
    </tr>
    <tr>
      <th>二郎</th>
      <td>50</td>
      <td>80</td>
      <td>70</td>
    </tr>
  </tbody>
</table>
</div>



# グラフの作成

PandasはMatplotlibとの相性も抜群でDataFrameからグラフを作ることも簡単にできます。


```python:Python
%matplotlib inline

x = np.linspace(0, 2*np.pi, 10)
df = pd.DataFrame(dict(sin=np.sin(x), cos=np.cos(x)), index=x)
df
```




<div>
<table class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>cos</th>
      <th>sin</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0.000000</th>
      <td>1.000000</td>
      <td>0.000000e+00</td>
    </tr>
    <tr>
      <th>0.698132</th>
      <td>0.766044</td>
      <td>6.427876e-01</td>
    </tr>
    <tr>
      <th>1.396263</th>
      <td>0.173648</td>
      <td>9.848078e-01</td>
    </tr>
    <tr>
      <th>2.094395</th>
      <td>-0.500000</td>
      <td>8.660254e-01</td>
    </tr>
    <tr>
      <th>2.792527</th>
      <td>-0.939693</td>
      <td>3.420201e-01</td>
    </tr>
    <tr>
      <th>3.490659</th>
      <td>-0.939693</td>
      <td>-3.420201e-01</td>
    </tr>
    <tr>
      <th>4.188790</th>
      <td>-0.500000</td>
      <td>-8.660254e-01</td>
    </tr>
    <tr>
      <th>4.886922</th>
      <td>0.173648</td>
      <td>-9.848078e-01</td>
    </tr>
    <tr>
      <th>5.585054</th>
      <td>0.766044</td>
      <td>-6.427876e-01</td>
    </tr>
    <tr>
      <th>6.283185</th>
      <td>1.000000</td>
      <td>-2.449294e-16</td>
    </tr>
  </tbody>
</table>
</div>




```python:Python
# グラフ出力
df.plot()
```




![output_68_1.png](https://qiita-image-store.s3.amazonaws.com/0/99505/0472a66d-f662-fc9d-6779-432e706a2345.png)