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
が作成されます。
辞書のkey
:DataFrameのコラム名
辞書のvalues
:DataFrameの値
d = {'Col0':[0, 1],
'Col1': [11, 12],
'Col2': [20, 21]}
df = pd.DataFrame(d)
インデックス名の設定
インデックス名を指定する場合には、次の2つの方法があります。
DataFrame
作成時にindex
を指定- 作成した
DataFrame
のindex
プロパティの書き換え
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
を作成する場合には、キーでインデックス名、カラム名が設定されます。
そのため引数でindex
、columns
で指定しても上書きされません。
その代わりに、index
、columns
で指定したラベル名のデータだけが抽出されて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】
Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!