Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Python

PythonでValueError: If using all scalar values, you must pass an indexエラーが出た時の対処方法

投稿日:2022年7月12日 更新日:

 

<目次>

(1) PythonでValueError: If using all scalar values, you must pass an indexエラーが出た時の対処方法
 (1-1) 事象・エラーメッセージ
 (1-2) 原因
 (1-3) 対策

PythonでValueError: If using all scalar values, you must pass an indexエラーが出た時の対処方法

PythonのpandasライブラリでValueError: If using all scalar values, you must pass an indexエラーが出る原因と対処についてご紹介します。

(1-1) 事象・エラーメッセージ

下記のようなJSON形式データをpandasで読み込みしようとした所、エラーになりました。
 
(テストデータ)
{
	"address1": "神奈川県",
	"address2": "横浜市神奈川区",
	"address3": "羽沢南",
	"kana1": "カナガワケン",
	"kana2": "ヨコハマシカナガワク",
	"kana3": "ハザワミナミ",
	"prefcode": "14",
	"zipcode": "2210866"
}
(エラーメッセージ)

Traceback (most recent call last):
~中略~
    raise ValueError("If using all scalar values, you must pass an index")
ValueError: If using all scalar values, you must pass an index
(図111)

(1-2) 原因

このエラーはPandasが値を「リスト」か「ディクショナリ」で待ち受けているのに対して、通常のスカラー値が来たために発生しています。

●Pandasが待ち受ける型の例

・List([XX,XX,・・])の中にDictionary({“key”:”value”,”key”:”value”})がある
またはその逆で
・Dictionary({“key”:”value”,”key”:”value”})のValueがList([XX,XX,・・])である
 
(図121)

(1-3) 対策

対策としては、インデックスを与えるか、インデックスがある型(List形式)に置き換えるか、になります。
・対策①スカラーはそのままで、インデックス指定を追加する
・対策②スカラーになっている部分を、List形式にする
 
以下、それぞれの具体的な例です。
 
・対策①スカラーはそのままで、インデックス指定を追加する
 
(修正前)
import json
import pandas as pd

def parse_json_pandas_main():
    # JSON形式のデータの保存パス
    path = r"C:\dev\Python\00_LocalPythonApp\Sample_JsonParse\TestData\TestData.json" 
    df = pd.read_json(path)
    print (df.info)

if __name__ == "__main__":
    parse_json_pandas_main()
(修正後)
ファイルをJSONオブジェクトとして読み込み、それをDataFrameメソッド実行時に、第二引数にindex=[1]を指定します。
import json
import pandas as pd

def parse_json_pandas_main():
    # JSON形式のデータの保存パス
    path = r"C:\dev\Python\00_LocalPythonApp\Sample_JsonParse\TestData\TestData_Before.json" 
    # JSONライブラリを用いて、JSONファイルのデータをJSONオブジェクトとしてロード
    with open(path,'r',encoding='utf-8', errors='ignore') as f:
        json_object = json.loads(f.read())
    df = pd.DataFrame(json_object, index=[1])
    print (df.info)

if __name__ == "__main__":
    parse_json_pandas_main()
(図131)

・対策②スカラーになっている部分を、List形式にする
JSON形式の各valueの部分を、値1つのListとして書き換えます。
 
(修正前)
{
	"address1": "神奈川県",
	"address2": "横浜市神奈川区",
	"address3": "羽沢南",
	"kana1": "カナガワケン",
	"kana2": "ヨコハマシカナガワク",
	"kana3": "ハザワミナミ",
	"prefcode": "14",
	"zipcode": "2210866"
}
(修正後)
{
	"address1": ["神奈川県"],
	"address2": ["横浜市神奈川区"],
	"address3": ["羽沢南"],
	"kana1": ["カナガワケン"],
	"kana2": ["ヨコハマシカナガワク"],
	"kana3": ["ハザワミナミ"],
	"prefcode": ["14"],
	"zipcode": ["2210866"]
}
(図132)
(図133)

(補足)

インデックスを与える事で、Pandasは内部的にはディクショナリの「key」を「カラム」として扱い、「value」を行の値として扱ってくれます。例えば{‘A’:’aa’,’B’:’bb’}というJSONデータをindex=[1]で読み込ませた場合、次のような表になります。
 
(表)
  A B
1 aa bb

このような挙動になるのは、pandas自体は’aa’や’bb’のデータが「何行分、必要なのか?」が分からないため、List形式にしたり、インデックスを指定する事で、それを明示的に指定する必要があるためです。

Adsense審査用広告コード


Adsense審査用広告コード


-Python

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Pythonでcsvを読み込んでデータベース化する方法~pandasのto_sqlを用いたテーブルへのINSERT~

<目次> (1) Pythonでcsvを読み込んでデータベース化する方法  (1-1) 構文(to_sql)  (1-2) 構文(to_sql)の引数  (1-3) サンプルプログラム (1) Pyt …

no image

Pythonでランダムな座標データを生成する方法

  <目次> (1) Pythonでランダムな座標データを生成する方法  (1-1) 使う構文  (1-2) サンプルプログラム  (1-3) 補足:データの座標を全体的にシフトしたい場合 …

PythonでHTTP Error 403: Forbiddenエラーが出た時の対処方法とエラーの意味について

(0)目次&概説 (1) エラー:HTTP Error 403: Forbidden  (1-1) 発生状況・エラーメッセージ  (1-2) 原因  (1-3) 対処方法   (1-3-1) 修正前の …

PythonのSQLAlchemyで「Identifier ‘XXX’ exceeds maximum length of 30 characters」エラーや「DtypeWarning: Columns (X) have mixed types.」警告が出た時の対処について

(0)目次&概説 (1) エラー1:sqlalchemy.exc.ArgumentError  (1-1) 発生状況・エラーメッセージ   (1-1-1) エラーメッセージ   (1-1-2) エラー …

no image

PythonでJSON形式データの値を取得する手順について

  <目次> (1) PythonでJSON形式データの値を取得する手順について  (1-1) サンプル①:ローカルのJSONファイルの読み込み(単純構造)  (1-2) サンプル②:ローカ …

  • English (United States)
  • 日本語
Top