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


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

辞書型(dictionary)のリスト

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

こういうデータです。

[
    [
        {'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化します。

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

iterator_list = list(itertools.chain.from_iterable(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'}, 
]

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

pandas.to_csv()でCSV出力

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

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出力します。

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"

まとめ

ソース全文

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