書籍で勉強する時章立てするのが面倒だから簡単に作れるようにした

## 背景
勉強するために、章ごとにまとめよう！と思い立ったはいいものの、そもそも章立てするのが面倒くさい。

Notionで勉強ノートを作ろうとした時に、テーブルビューに1.1, 1,2 1,3……と書いていくには面倒くさいし、それを打つと思うと、そもそも勉強自体に手が伸びなくなる。

経験上、章立てした方が勉強効率が上がることはわかっているので簡単に作れないかPythonでやってみた。

## 章の構成をcsvに落とし込む
『Python機械学習プログラミング』を例に、章立てをやってみる。この本は18章あり、各所で区切りがある。
例えば1章の

「データから学習する能力」をコンピュータに与える

には、5つの見出しがある。それを1.5と表現したい。ただし、章のタイトルも失いたくないので、今回のcsvはこんな構成にした。

```plaintext
名前,章,見出し
「データから学習する能力」をコンピュータに与える,1,5
分類問題 - 単純な機械学習アルゴリズムの訓練,2,7
分類問題 - 機械学習ライブラリ scikit - learnの活用,3,6
.
.
.

```
見出しの列は、見出しの個数を意味している。
これを1列のcsvに落とし込み、次のような形をゴールとする。

## 作成

ライブラリにpandasを入れ、csvを読み込み構造を確認する。
```python
import pandas as pd
df = pd.read_csv('original.csv')
df.head()
```
すると次のような項目であった。
<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>名前</th>
      <th>章</th>
      <th>見出し</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>「データから学習する能力」をコンピュータに与える</td>
      <td>1</td>
      <td>5</td>
    </tr>
    <tr>
      <th>1</th>
      <td>分類問題 - 単純な機械学習アルゴリズムの訓練</td>
      <td>2</td>
      <td>7</td>
    </tr>
    <tr>
      <th>2</th>
      <td>分類問題 - 機械学習ライブラリ scikit - learnの活用</td>
      <td>3</td>
      <td>6</td>
    </tr>
    <tr>
      <th>3</th>
      <td>データ前処理 - よりよいトレーニングセットの構築</td>
      <td>4</td>
      <td>3</td>
    </tr>
    <tr>
      <th>4</th>
      <td>次元削減でデータを圧縮する</td>
      <td>5</td>
      <td>6</td>
    </tr>
  </tbody>
</table>
</div>

ループ処理で配列にそれぞれを入れ込んでいく。
この段階で気がついたけどDataFrameってデータを追加することをあんまり想定してないのね…
ということで配列に入れ込んでいく。
```python
data = []
for i in range(df.shape[0]):
    data.append(str(df.iloc[i,0])) 
    for j in range(df.iloc[i,2]):
        # 0からカウントされるため
        data.append (str(i + 1)+ "." + str(j + 1))
```
これ、カウントを1からにした方がいいかとも思ったがどのみち調整が必要になりそうだったのでとりあえずこれで。

リストをデータフレームに変換し、問題がない確認する。

```python
# リストをデータフレームに変換
df_out = pd.DataFrame(data)
df_out
```

<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>0</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>「データから学習する能力」をコンピュータに与える</td>
    </tr>
    <tr>
      <th>1</th>
      <td>1.1</td>
    </tr>
    <tr>
      <th>2</th>
      <td>1.2</td>
    </tr>
    <tr>
      <th>3</th>
      <td>1.3</td>
    </tr>
    <tr>
      <th>4</th>
      <td>1.4</td>
    </tr>
    <tr>
      <th>...</th>
      <td>...</td>
    </tr>
    <tr>
      <th>101</th>
      <td>複雑な環境での意思決定 - 強化学習</td>
    </tr>
    <tr>
      <th>102</th>
      <td>18.1</td>
    </tr>
    <tr>
      <th>103</th>
      <td>18.2</td>
    </tr>
    <tr>
      <th>104</th>
      <td>18.3</td>
    </tr>
    <tr>
      <th>105</th>
      <td>18.4</td>
    </tr>
  </tbody>
</table>
<p>106 rows × 1 columns</p>
</div>

問題なさそうなので、csvで出力

```python
df_out.to_csv('output.csv', index=False)
```

これをNotionに読み込むとこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529390/1d6af4e5-1cf8-8b9a-a954-685f72cc962d.png)

まあ気になる点（項目のタイトルがない）が、それは結局最初のcsvではできないし、とりあえずこんな感じで良いではないだろうか？

これで「章立て作るのめんどくさい」という言い訳からは逃れられなくなった。