Pythonで、データフレームを辞書から新規に作ろうとしたらエラーが出ました。
>>> import pandas as pd
>>> hoge = {'foo': 1, 'bar': 'aaa', 'baz': 3}
>>> df = pd.DataFrame.from_dict(hoge)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.8/site-packages/pandas/core/frame.py", line 1593, in from_dict
return cls(data, index=index, columns=columns, dtype=dtype)
File "/usr/local/lib/python3.8/site-packages/pandas/core/frame.py", line 614, in __init__
mgr = dict_to_mgr(data, index, columns, dtype=dtype, copy=copy, typ=manager)
File "/usr/local/lib/python3.8/site-packages/pandas/core/internals/construction.py", line 464, in dict_to_mgr
return arrays_to_mgr(
File "/usr/local/lib/python3.8/site-packages/pandas/core/internals/construction.py", line 119, in arrays_to_mgr
index = _extract_index(arrays)
File "/usr/local/lib/python3.8/site-packages/pandas/core/internals/construction.py", line 625, in _extract_index
raise ValueError("If using all scalar values, you must pass an index")
ValueError: If using all scalar values, you must pass an index
上記ではfrom_dict
を使っていますが、pandas.DataFrame(hoge)
としても結果は変同じでした。
「スカラー値を使う場合、インデックスを渡さないとダメだよー」というエラーなので、解決策としてはスカラー値を使わないか、インデックスを渡すのどちらかということになります。
>>> hoge_good = {'foo': [1], 'bar': 'aaa', 'baz': 3}
>>> df = pd.DataFrame.from_dict(hoge_good)
>>> df
foo bar baz
0 1 aaa 3
>>> df = pd.DataFrame(hoge_good)
>>> df
foo bar baz
0 1 aaa 3
まず、元データの辞書内でスカラー値を使わないパターンです。1つ目の値を1
から[1]
に変更しています。つまり、スカラー値を使わないためにリストを用いているわけです。これを行うことで、何事もなかったかのようにエラーが消えます。なんでだよ。
ただ、3つ目の要素の3
もスカラー値なはずですが、なぜかこちらは何もしなくてもいいんですよね。コレガワカラナイ。いやホントに謎。ただ、とにかくなぜかこれで動作するんですよね。
>>> df = pd.DataFrame(hoge, index=[0])
>>> df
foo bar baz
0 1 aaa 3
今度はインデックスを指定するパターンです。オプションのindex=
を使ってインデックスを指定しています。なお、from_dict()
にはインデックスを指定できるようなオプションがないっぽいので、ここではpandas.DataFrame
のみ利用しています。エラーメッセージからすると、この対応方法こそ正攻法であるような気がします。