【Python】pandasで辞書型のリストをCSV出力する（備忘録）

少し悩んだので自分用メモ

# 辞書型（dictionary）のリスト
Pythonで辞書型のリストを扱うことがあると思います。
（少なくとも私はよく使っています）

こういうデータです。

```json
[
    [
        {'No': 1, 'Name': 'Yamada Taro',   'LastLoginTime': '2021-03-16 15:44:16'}, 
        {'No': 2, 'Name': 'Yamada Jiro',   'LastLoginTime': '2021-03-10 00:12:17'}, 
    ],
    [
        {'No': 3, 'Name': 'Yamada Saburo', 'LastLoginTime': '2021-03-20 12:01:02'}, 
    ],
    [
        {'No': 4, 'Name': 'Yamada Shiro',  'LastLoginTime': '2020-12-24 00:00:13'}, 
        {'No': 5, 'Name': 'Yamada Goro',   'LastLoginTime': '2021-03-17 11:01:55'}, 
    ]
]
```

こういった形式のデータをCSV出力したくて色々と試行錯誤しました。
pythonの知識不足ですんなりとは出来なかったです。

# itertools.chain.from_iterable()で辞書型のリストを整理
まずはitertools.chain.from_iterable()を使って全iterableの要素を返すイテレータを作成し、list化します。

```python
dic_list = 辞書型のリストデータ

iterator_list = list(itertools.chain.from_iterable(dic_list))
```

```json
[
    {'No': 1, 'Name': 'Yamada Taro',   'LastLoginTime': '2021-03-16 15:44:16'}, 
    {'No': 2, 'Name': 'Yamada Jiro',   'LastLoginTime': '2021-03-10 00:12:17'}, 
    {'No': 3, 'Name': 'Yamada Saburo', 'LastLoginTime': '2021-03-20 12:01:02'}, 
    {'No': 4, 'Name': 'Yamada Shiro',  'LastLoginTime': '2020-12-24 00:00:13'}, 
    {'No': 5, 'Name': 'Yamada Goro',   'LastLoginTime': '2021-03-17 11:01:55'}, 
]
```

リストのリスト・・・となっていたデータが上記のように整理されます。

# pandas.to_csv()でCSV出力

あとはみなさんお馴染みの方法でCSV出力します。
まずpandasのjson_normalizeで辞書のリストをDataFrameに変換します。

```pyhthon
df = pandas.io.json.json_normalize(iterator_list)
```

```
   No           Name        LastLoginTime
0   1    Yamada Taro  2021-03-16 15:44:16
1   2    Yamada Jiro  2021-03-10 00:12:17
2   3  Yamada Saburo  2021-03-20 12:01:02
3   4   Yamada Shiro  2020-12-24 00:00:13
4   5    Yamada Goro  2021-03-17 11:01:55
```

次にpandasのto_csv()でDataFrameをCSV出力します。

```pyhthon
df.to_csv('data.csv', index=False, encoding='utf-8', quoting=csv.QUOTE_ALL)
```

今回はindexオプションをFalseにしてindexを非表示に、quotingオプションにダブルクオーテーションを指定しています。
下記がCSVの出力結果です。

```
"No","Name","LastLoginTime"
"1","Yamada Taro","2021-03-16 15:44:16"
"2","Yamada Jiro","2021-03-10 00:12:17"
"3","Yamada Saburo","2021-03-20 12:01:02"
"4","Yamada Shiro","2020-12-24 00:00:13"
"5","Yamada Goro","2021-03-17 11:01:55"
```

# まとめ

ソース全文

```python
import itertools
import pandas
import csv

dic_list =  [
                [
                    {'No': 1, 'Name': 'Yamada Taro',   'LastLoginTime': '2021-03-16 15:44:16'}, 
                ],
                [
                    {'No': 2, 'Name': 'Yamada Jiro',   'LastLoginTime': '2021-03-10 00:12:17'}, 
                    {'No': 3, 'Name': 'Yamada Saburo', 'LastLoginTime': '2021-03-20 12:01:02'}, 
                ],
                [
                    {'No': 4, 'Name': 'Yamada Shiro',  'LastLoginTime': '2020-12-24 00:00:13'}, 
                    {'No': 5, 'Name': 'Yamada Goro',   'LastLoginTime': '2021-03-17 11:01:55'}, 
                ]
            ]

iterator_list = list(itertools.chain.from_iterable(dic_list))
df = pandas.io.json.json_normalize(iterator_list)
df.to_csv('data.csv', index=False, encoding='utf-8', quoting=csv.QUOTE_ALL)
```

出力結果CSV

```
"No","Name","LastLoginTime"
"1","Yamada Taro","2021-03-16 15:44:16"
"2","Yamada Jiro","2021-03-10 00:12:17"
"3","Yamada Saburo","2021-03-20 12:01:02"
"4","Yamada Shiro","2020-12-24 00:00:13"
"5","Yamada Goro","2021-03-17 11:01:55"
```

以上

[docs.python.org itertools](https://docs.python.org/ja/3/library/itertools.html#itertools.chain.from_iterable)