YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

pandas 辞書型からDataFrameを生成|インデックスとコラムの設定も!

pandasでは、pythonの辞書型からデータフレームを生成することもできます。

しかし、pandasの操作に慣れていないうちは、ちょっとした操作も難しいですよね。

例えば、次のようなことで悩んでしまうことも:

  • 辞書型からDataFrameを作るにはどうすればいいの?
  • 辞書のキーはインデックス名になるの?コラム名になるの?

そこで、この記事では次の内容をサンプルコード付きで解説していきます。

  • 辞書型からデータフレームを生成する方法
  • 辞書のキーをインデックス名、コラム名それぞれに設定する方法
  • DataFrame()DataFrame.from_dict()の違いについて

DataFrame生成のパターンをマスターして、自由にDataFrameを作れるようになりましょう!

 

辞書型からDataFrame生成する2つの方法

辞書型からDataFrameを生成する際には、次の2つの方法があります。

  • df = pd.DataFrame()
  • df = pd.DataFrame.from_dict()

挙動としてはかなり似ていていますが、次のような使い分けをすると良いと思います。

  • キーをカラム名に設定する場合:df = pd.DataFrame()
  • キーをインデックス名に設定する場合:df = pd.DataFrame.from_dict()

なぜこういった使い分けがおススメなのか、各関数の使い方を解説しながら紹介していきます!

pd.DataFrame()の使い方

まずはpd.DataFrame()の使用方法を解説していきます。

  • 基本的な使い方
  • インデックス名の設定
  • DataFrame化する要素の指定

基本的な作成方法|{key:values} ⇒ df

辞書型をpd.DataFrame()に渡すと次のようにDataFrameが作成されます。

  • 辞書のkeyDataFrameのコラム名
  • 辞書のvaluesDataFrameの値
d = {'Col0':[0, 1],
     'Col1': [11, 12],
     'Col2': [20, 21]}
 
df = pd.DataFrame(d)

インデックス名の設定

インデックス名を指定する場合には、次の2つの方法があります。

  • DataFrame作成時にindexを指定
  • 作成したDataFrameindexプロパティの書き換え
d = {'Col0':[0, 1], 'Col1': [11, 12], 'Col2': [20, 21]}
df = pd.DataFrame(data=d, index=["Ind0", "Ind1"])
d = {'Col0':[0, 1], 'Col1': [11, 12], 'Col2': [20, 21]}
df = pd.DataFrame(data=d)
df.index =["Ind0", "Ind1"]

特に理由がなければ、作成時に書き換えてしまった方が一行で済んでいいですね。

DataFrame化する要素の指定

pd.DataFrame()の引数として、columnsを指定するとDataFrame化する要素を指定できます。

d = {'Col0':[0, 1], 'Col1': [11, 12], 'Col2': [20, 21], 'Col3': [31, 32], 'Col4': [40, 41]}
df = pd.DataFrame(data=d, columns=["Col0", "Col4"])

存在しないカラム名を指定するとデータがNaNになります。

d = {'Col0':[0, 1], 'Col1': [11, 12], 'Col2': [20, 21], 'Col3': [31, 32], 'Col4': [40, 41]}
df = pd.DataFrame(data=d, columns=["Col0", "Col4", "Col10"])

indexと異なり、columnsはカラム名の設定にはならないので注意してください!

ネスト構造の辞書からdf作成

ネスト構造の辞書とは、次のように辞書の中に辞書が入っている辞書です。

  • {key_a: {key0: value0, key1: value1}}

この場合、外側と内側のキーをもとにカラムとインデックスが設定されます。

  • 外側のキー(key_a):カラム
  • 内側のキー(key0, key1):インデックス
d = {"col0":{"ind0": 0, "ind1":1},
     "col1":{"ind0": 10, "ind1":11}}
df = pd.DataFrame(data=d)

ネスト構造の辞書の場合は、内側外側のキーをもとにDataFrameのデータが順次埋められていくイメージです。

データが存在しない箇所はNaNで埋めてくれます。

d = {"col0":{"ind0": 0, "ind1":1},
     "col1":{"ind0": 10, "ind1":11, "ind2":12}}
df = pd.DataFrame(data=d)

ネスト構造の辞書からdfを作成する場合には、キーでインデックス名、カラム名が設定されます。

そのため引数でindexcolumnsで指定しても上書きされません。

その代わりに、indexcolumnsで指定したラベル名のデータだけが抽出されてDataFrameが作成されます。

d = {'Col0':{"Ind0": 0, "Ind1":1, "Ind2":2},
     'Col1':{"Ind0": 0, "Ind1":1, "Ind2":2},
     'Col2':{"Ind0": 0, "Ind1":1, "Ind2":2},
     'Col3':{"Ind0": 0, "Ind1":1, "Ind2":2},}
df = pd.DataFrame(d, index=["Ind0", "Ind2"], columns=["Col1", "Col2"])

pd.DataFrame.from_dict()の使い方

pd.DataFrame()とほとんど同じ使い方ができますが…。

pd.DataFrame.from_dict()の特徴は、引数orientでデータ設定の方向を指定できることです。

  • キーをカラム名に設定|orient = "columns"(デフォルトなので省略可)
  • インデックス名に設定|orient = "index"

具体的な使い方を解説していきます。

キーをカラム名に設定|orient="columns"

これはpd.DataFrame()を使用するのと同じです。

d = {'Data0':[1, 2],
     'Data1':[3, 4],
     'Data2':[5, 6]}
df = pd.DataFrame.from_dict(d, orient="columns")
# df = pd.DataFrame.from_dict(d) # デフォルト値なのでorient="columns"は省略可能
# df = pd.DataFrame(d) # pd.DataFrame()でも同じ結果

キーをインデックス名に設定|orient="index"

orient = "index"とすると、キーがインデックス名として設定されます。

d = {'Data0':[1, 2],
     'Data1':[3, 4],
     'Data2':[5, 6]}
df = pd.DataFrame.from_dict(d, orient="index")

このとき、引数columnsでカラム名を設定することができます。

d = {'Data0':[1, 2],
     'Data1':[3, 4],
     'Data2':[5, 6]}
df = pd.DataFrame.from_dict(d, orient="index", columns=["Col0", "Col1"])

実はpd.DataFrame()も転置すれば同じことができますが…。

d = {'Data0':[1, 2],
     'Data1':[3, 4],
     'Data2':[5, 6]}
df = pd.DataFrame(d, index=["Col0", "Col1"]).T

カラム名の設定をindexで指定することになって、わけがわからなくなりますね。

転置するよりもpd.DataFrame.from_dict()orine="index"とした方が良さそうです。

ネスト構造の辞書|orientで行列逆転

ネスト構造の辞書でorientを指定すると、外側・内側どちらのキーをコラム名・インデックス名に設定するか変更できます。

orient="columns"の場合は、外側のキーがカラム名、内側のキーがインデックス名になります。

d = {"Data0":{"Val0": 0, "Val1":1},
     "Data1":{"Val0": 10, "Val1":11}}
df = pd.DataFrame.from_dict(d, orient="columns")  # orient="columns"はデフォルトなので省略可

orient="index"の場合は、外側のキーがインデックス名、内側のキーがカラム名になります。

d = {"Data0":{"Val0": 0, "Val1":1},
     "Data1":{"Val0": 10, "Val1":11}}
df = pd.DataFrame.from_dict(d, orient="index")

おわりに|padans関連おススメ追加コンテンツ

今回はリストからDataFrameを生成する方法と関連情報を紹介しました。

pandasは便利すぎて操作方法がわかりにくいことがよくあります…。

結局はコツコツ学ぶのが、pandasマスターの近道ですよね!≫【ブログカテゴリー:pandas】

≫【レビュー】「Pythonによるデータ分析入門」| pandas開発者によるpandasユーザーのためのpandasの教科書!
≫【レビュー】「Pythonによるデータ分析入門」| pandas開発者によるpandasユーザーのためのpandasの教科書!
「Pythonによるデータ分析入門」を、最初から最後まで実際に実践してみたレビューです。具体的にどのようなことができるようになったかを実例付きで紹介します!・DataFrameの生成方法・欠損値の処理方法・グラフ化の方法気になる学習時間は…?
www.yutaka-note.com/entry/2019/12/07/230219
 
≫pandas リストからDataFrameを生成|インデックスとコラムの設定も!
≫pandas リストからDataFrameを生成|インデックスとコラムの設定も!
pandasでは、リストからデータフレームを生成することもできます。しかし、pandasの操作に慣れていないうちは、ちょっとした操作も難しいですよね。この記事では、①リストからデータフレームを生成、行と列を追加する方法、②インデックス名、コラム名を設定する方法、③DataFrameを転値する方法(行と列が期待と逆だった時の対応)をサンプルコード付きで紹介!
www.yutaka-note.com/entry/pandas_list
 
≫【レビュー】「Python実践データ分析100本ノック」|100本終えたらpandasが好きになっていた
≫【レビュー】「Python実践データ分析100本ノック」|100本終えたらpandasが好きになっていた
Python実践データ分析100本ノックで、実際に100本終了したレビューです。pythonでのデータ分析の入門書としてかなりの良書だったと思います。・python2~3冊目に何を勉強しようか迷っている人・時間をかけずにデータ分析の基本を学びたい人・pandasへの抵抗を減らしたい人
www.yutaka-note.com/entry/nock_100
 
≫pandas | read_excel() 図解でわかりやすく解説!
≫pandas | read_excel() 図解でわかりやすく解説!
pandasで、excelファイルを読み込むための関数read_excel()について、図解で徹底解説!①表のデータがセルA1から始まっていないときの対応方法②indexやlabelの行や列を指定する方法
www.yutaka-note.com/entry/pandas_read_excel_1
 
≫pandas | read_csv() 図解でわかりやすく解説!
≫pandas | read_csv() 図解でわかりやすく解説!
pandasでcsvファイルを読み込むための関数read_csv()について、図解で徹底解説! ①区切り文字の指定②indexやlabelの行や列を指定する方法③読み込む行・列の指定など細かい設定についての解説記事です!
www.yutaka-note.com/entry/pandas_read_csv
 
≫pandas|head(), tail()でデータ先頭, 末尾を抽出!
≫pandas|head(), tail()でデータ先頭, 末尾を抽出!
pandasのDataFrameやSeriesで先頭や末尾の数行をさっと確認したい場合には、head()、tail()メソッドを使用します。引数で表示する行数を指定することもできますので、その使用方法を解説していきます。
www.yutaka-note.com/entry/pandas_head_tail
 

Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。

気楽にツイートしているので、気軽にフォローしてください!