iMind Developers Blog

iMind開発者ブログ

pandasのto_dictでdictionaryの生成

概要

pandasのto_dictは引数にいろいろなモードを指定できるので、それらの動きを確認しておく。

序盤はorientごとの結果の表示。後半はユースケース。

バージョン情報

  • Python 3.7.3
  • pandas==0.25.1

サンプルデータ

カラムA〜Cを持つDataFrameを用意する。サンプルコードではこのDataFrameに対して実行する。

import pandas as pd
df = pd.DataFrame([
    {'A': 'value1', 'B': 1, 'C': [1, 2, 3]},
    {'A': 'value2', 'B': 2, 'C': [4, 5, 6]},
    {'A': 'value3', 'B': 3, 'C': [7, 8, 9]},
])

df.head()
    #=>         A  B          C
    #=> 0  value1  1  [1, 2, 3]
    #=> 1  value2  2  [4, 5, 6]
    #=> 2  value3  3  [7, 8, 9]

orientごとの動作比較

to_dictはorientを引数に取る。

df.to_dict(orient)

orientにはdict, list, series, split, records, indexの6種類が指定できる。

サンプルデータのDataFrameと, そのT, set_index('A) + Tした3パターンでそれぞれ生成される結果を比較する。

dictはカラム名をキーとし、値をdictで返す。

df.to_dict('dict')
    #=> {'A': {0: 'value1', 1: 'value2', 2: 'value3'},
    #=>  'B': {0: 1, 1: 2, 2: 3},
    #=>  'C': {0: [1, 2, 3], 1: [4, 5, 6], 2: [7, 8, 9]}}

# T
df.T.to_dict('dict')
    #=> {0: {'A': 'value1', 'B': 1, 'C': [1, 2, 3]},
    #=>  1: {'A': 'value2', 'B': 2, 'C': [4, 5, 6]},
    #=>  2: {'A': 'value3', 'B': 3, 'C': [7, 8, 9]}}

# set_index('A') + T
df.set_index('A').T.to_dict('dict')
    #=> {'value1': {'B': 1, 'C': [1, 2, 3]},
    #=>  'value2': {'B': 2, 'C': [4, 5, 6]},
    #=>  'value3': {'B': 3, 'C': [7, 8, 9]}}

listはカラム名をキーとし、値をlistで返す。

df.to_dict('list')
    #=>{'A': ['value1', 'value2', 'value3'],
    #=> 'B': [1, 2, 3],
    #=> 'C': [[1, 2, 3], [4, 5, 6], [7, 8, 9]]}

# T
df.T.to_dict('list')
    #=> {0: ['value1', 1, [1, 2, 3]],
    #=>  1: ['value2', 2, [4, 5, 6]],
    #=>  2: ['value3', 3, [7, 8, 9]]}

# set_index('A') + T
df.set_index('A').T.to_dict('list')
    #=> {'value1': {'B': 1, 'C': [1, 2, 3]},
    #=>  'value2': {'B': 2, 'C': [4, 5, 6]},
    #=>  'value3': {'B': 3, 'C': [7, 8, 9]}}

seriesはカラム名をキーとし、値をseriesで返す。

df.to_dict('series')
    #=> {'A': 0    value1
    #=>  1    value2
    #=>  2    value3
    #=>  Name: A, dtype: object, 'B': 0    1
    #=>  1    2
    #=>  2    3
    #=>  Name: B, dtype: int64, 'C': 0    [1, 2, 3]
    #=>  1    [4, 5, 6]
    #=>  2    [7, 8, 9]
    #=>  Name: C, dtype: object}

# T
df.T.to_dict('series')
    #=> {0: A       value1
    #=>  B            1
    #=>  C    [1, 2, 3]
    #=>  Name: 0, dtype: object, 1: A       value2
    #=>  B            2
    #=>  C    [4, 5, 6]
    #=>  Name: 1, dtype: object, 2: A       value3
    #=>  B            3
    #=>  C    [7, 8, 9]
    #=>  Name: 2, dtype: object}

# set_index('A') + T
df.set_index('A').T.to_dict('series')
    #=> {'value1': B            1
    #=>  C    [1, 2, 3]
    #=>  Name: value1, dtype: object, 'value2': B            2
    #=>  C    [4, 5, 6]
    #=>  Name: value2, dtype: object, 'value3': B            3
    #=>  C    [7, 8, 9]
    #=>  Name: value3, dtype: object}

splitはindex, columns, dataを分けて返す。

df.to_dict('split')
    #=> {'index': [0, 1, 2],
    #=>  'columns': ['A', 'B', 'C'],
    #=>  'data': [['value1', 1, [1, 2, 3]],
    #=>   ['value2', 2, [4, 5, 6]],
    #=>   ['value3', 3, [7, 8, 9]]]}

# T
df.T.to_dict('split')
    #=> {'index': ['A', 'B', 'C'],
    #=>  'columns': [0, 1, 2],
    #=>  'data': [['value1', 'value2', 'value3'],
    #=>   [1, 2, 3],
    #=>   [[1, 2, 3], [4, 5, 6], [7, 8, 9]]]}

# T + set_indexは割愛

recordsはindexを含まないrecordのlistを返す。

df.to_dict('records')
    #=> [{'A': 'value1', 'B': 1, 'C': [1, 2, 3]},
    #=>  {'A': 'value2', 'B': 2, 'C': [4, 5, 6]},
    #=>  {'A': 'value3', 'B': 3, 'C': [7, 8, 9]}]

# T
df.T.to_dict('records')
    #=> [{0: 'value1', 1: 'value2', 2: 'value3'},
    #=>  {0: 1, 1: 2, 2: 3},
    #=>  {0: [1, 2, 3], 1: [4, 5, 6], 2: [7, 8, 9]}]

# set_index('A')  ※Tなし
df.set_index('A').to_dict('records')
    #=> [{'B': 1, 'C': [1, 2, 3]}, {'B': 2, 'C': [4, 5, 6]}, {'B': 3, 'C': [7, 8, 9]}]

indexはindexをキーとしたrecordの一覧を返す。

df.to_dict('index')
    #=> [{'A': 'value1', 'B': 1, 'C': [1, 2, 3]},
    #=>  {'A': 'value2', 'B': 2, 'C': [4, 5, 6]},
    #=>  {'A': 'value3', 'B': 3, 'C': [7, 8, 9]}]

# df.to_dict('index') と df.T.to_dict('dict') は同じ結果

# T
df.T.to_dict('index')
    #=> {'A': {0: 'value1', 1: 'value2', 2: 'value3'},
    #=>  'B': {0: 1, 1: 2, 2: 3},
    #=>  'C': {0: [1, 2, 3], 1: [4, 5, 6], 2: [7, 8, 9]}}

# set_index('A')  ※Tなし
df.set_index('A').to_dict('index')
    #=> {'value1': {'B': 1, 'C': [1, 2, 3]},
    #=>  'value2': {'B': 2, 'C': [4, 5, 6]},
    #=>  'value3': {'B': 3, 'C': [7, 8, 9]}}

行をdictにしたlistの生成

カラムA〜Cをdictionaryで持つlistを生成する。個人的には一番よく使う。

df.to_dict('record')
    #=> [{'A': 'value1', 'B': 1, 'C': [1, 2, 3]},
    #=>  {'A': 'value2', 'B': 2, 'C': [4, 5, 6]},
    #=>  {'A': 'value3', 'B': 3, 'C': [7, 8, 9]}]

カラムAをキーに、カラムBを値に持つdictionaryの生成

カラムAの値をkeyとして、Bをvalueとするdictionaryを生成する。

この場合はDataFrameのto_dictではなくSeriesを使う。

df.set_index('A').B.to_dict()
    #=> {'value1': 1, 'value2': 2, 'value3': 3}

Aをキーに、BとCをlistで持つdictionaryの生成

カラムAの値をkeyとして、BとCをlistでvalueとして持つ。

df.set_index('A').T.to_dict('list')
    #=> {'value1': [1, [1, 2, 3]], 'value2': [2, [4, 5, 6]], 'value3': [3, [7, 8, 9]]

Aをキーに、BとCをdictionaryで持つdictionaryの生成

カラムAの値をkeyとして、BとCはdictionary型で保持する。

df.set_index('A').to_dict('index')
    #=> {'value1': {'B': 1, 'C': [1, 2, 3]},
    #=>  'value2': {'B': 2, 'C': [4, 5, 6]},
    #=>  'value3': {'B': 3, 'C': [7, 8, 9]}}

改定履歴

Author: Masato Watanabe, Date: 2019-09-01, 記事投稿