Pandas の DataFrame を辞書に変換

  1. Pandas の DataFrame を辞書に変換する to_dict() 関数
  2. Pandas の DataFrame から辞書への値のリストまたは Series の変換
  3. Pandas の DataFrame を辞書のリストに変換する
  4. Pandas の DataFrame から行ごとに辞書への出力
  5. key として 1つの列を持つ辞書への DataFrame
  6. dict()zip() 関数を用いた Pandas DataFrame から辞書への出力

このチュートリアルでは、インデックス列の要素をキー、他の列の対応する要素を値として、Pandas DataFrame を辞書に変換する方法を紹介します。記事では以下の DataFrame を使用します。

import pandas as pd

df = pd.DataFrame([['Jay',16,'BBA'],
                   ['Jack',19,'BTech'],
                   ['Mark',18,'BSc']],
                  columns = ['Name','Age','Course'])

print(df)

出力:

   Name  Age Course
0   Jay   16    BBA
1  Jack   19  BTech
2  Mark   18    BSc

Pandas の DataFrame を辞書に変換する to_dict() 関数

Pandas の to_dict() 関数は DataFrame を辞書に変換します。パラメータは辞書の形式と、キーと値のペアの関連付け方法を決定します。以下に、to_dict() を使って DataFrame を辞書に変換する初歩的な例を示します。

import pandas as pd

df = pd.DataFrame([['Jay',16,'BBA'],
                   ['Jack',19,'BTech'],
                   ['Mark',18,'BSc']],
                  columns = ['Name','Age','Course'])

d1 = df.to_dict()
print(d1)

出力:

{'Name': {0: 'Jay', 1: 'Jack', 2: 'Mark'}, 'Age': {0: 16, 1: 19, 2: 18}, 'Course': {0: 'BBA', 1: 'BTech', 2: 'BSc'}}

出力を見るとわかるように、カラム名はキーに変換され、各レコードはインデックスをキーとした値に変換されます。

Pandas の DataFrame から辞書への値のリストまたは Series の変換

関数 to_dict()listrecordsSeriesindexsplitdict などのパラメータを渡すことで、最終的な辞書の形式を変更することができます。例えば、listseries をパラメータとして渡すと、カラム名がキーとなりますが、値のペアはそれぞれリストと行の系列に変換されます。次の例はこれを示しています。

import pandas as pd

df = pd.DataFrame([['Jay',16,'BBA'],
                   ['Jack',19,'BTech'],
                   ['Mark',18,'BSc']],
                  columns = ['Name','Age','Course'])

d_list  = df.to_dict('list')
print(d_list)

d_series = df.to_dict('series')
print(d_series)

出力:

{'Name': ['Jay', 'Jack', 'Mark'], 'Age': [16, 19, 18], 'Course': ['BBA', 'BTech', 'BSc']}

{'Name': 0     Jay
1    Jack
2    Mark
Name: Name, dtype: object, 'Age': 0    16
1    19
2    18
Name: Age, dtype: int64, 'Course': 0      BBA
1    BTech
2      BSc
Name: Course, dtype: object}

Pandas の DataFrame を辞書のリストに変換する

また、関数に records を渡すことで、各行を個別の辞書として扱うこともできます。最終的な結果は、各行を辞書として持つリストとなります。例えば、

import pandas as pd

df = pd.DataFrame([['Jay',16,'BBA'],
                   ['Jack',19,'BTech'],
                   ['Mark',18,'BSc']], columns = ['Name','Age','Course'])

d_records = df.to_dict('records')
print(d_records)

出力:

[{'Name': 'Jay', 'Age': 16, 'Course': 'BBA'}, {'Name': 'Jack', 'Age': 19, 'Course': 'BTech'}, {'Name': 'Mark', 'Age': 18, 'Course': 'BSc'}]

Pandas の DataFrame から行ごとに辞書への出力

しかし、多くの場合、カラム名を辞書のキーにしたくない場合があります。そのような場合は、index を渡すことで DataFrame のインデックスをキーにすることができます。以下のコードスニペットがそれを示しています。

import pandas as pd

df = pd.DataFrame([['Jay',16,'BBA'],
                   ['Jack',19,'BTech'],
                   ['Mark',18,'BSc']], columns = ['Name','Age','Course'])

d_index = df.to_dict('index')
print(d_index)

出力:

{0: {'Name': 'Jay', 'Age': 16, 'Course': 'BBA'}, 1: {'Name': 'Jack', 'Age': 19, 'Course': 'BTech'}, 2: {'Name': 'Mark', 'Age': 18, 'Course': 'BSc'}}

key として 1つの列を持つ辞書への DataFrame

しかし、ある列の要素をキーとし、他の列の要素を値としたい場合はどうでしょうか?これは、必要なカラムを DataFrame のインデックスにして、.T() 関数を使って転置を取るだけで可能です。

import pandas as pd

df = pd.DataFrame([['Jay',16,'BBA'],
                   ['Jack',19,'BTech'],
                   ['Mark',18,'BSc']], columns = ['Name','Age','Course'])

d_names = df.set_index('Name').T.to_dict('list')
print(d_names)

出力:

{'Jay': [16, 'BBA'], 'Jack': [19, 'BTech'], 'Mark': [18, 'BSc']}

dict()zip() 関数を用いた Pandas DataFrame から辞書への出力

Python の dict() 関数は Pandas DataFrame を辞書に変換することもできます。また、並列イテレータを作成するために、個々の列を引数として zip() 関数を使用しなければなりません。そうすれば、zip() 関数は各イテレータで 1つの行にあるすべての値を返してくれます。

import pandas as pd

df = pd.DataFrame([['Jay',16,'BBA'],
                   ['Jack',19,'BTech'],
                   ['Mark',18,'BSc']], columns = ['Name','Age','Course'])

d =  dict([(i,[a,b]) for i,a,b in zip(df['Name'], df['Age'],df['Course'])])
print(d)

出力:

{'Jay': [16, 'BBA'], 'Jack': [19, 'BTech'], 'Mark': [18, 'BSc']}

関連記事 - Pandas DataFrame

  • JSON を Pandas DataFrame に変換する
  • Pandas のデフォルト値で既存の DataFrame に新しい列を追加する方法