頑張らないために頑張る

ゆるく頑張ります

「If using all scalar values, you must pass an index」エラーが出たら、インデックスを指定する

Posted at — Feb 26, 2022

データフレーム作ろうとしたらエラー出た

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のみ利用しています。エラーメッセージからすると、この対応方法こそ正攻法であるような気がします。

参考

  1. pandas.DataFrame.from_dict
  2. pandasのDataFrame新規作成時のエラー:If using all scalar values, you must pass an index
  3. Constructing pandas DataFrame from values in variables gives “ValueError: If using all scalar values, you must pass an index”
comments powered by Disqus