LoginSignup
3
4

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-03-28

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

辞書型(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

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4