概要
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, 記事投稿