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で「ERROR: Could not install packages due to an OSError: [WinError 2]」が出た時の原因と対処方法について

  <目次> (1) Pythonで「ERROR: Could not install packages due to an OSError: [WinError 2]」が出た時の原因と対処 …

pyenvの使い方(基礎編)をご紹介

  <目次> (1) pyenvの使い方(基礎編)をご紹介  (1-1) STEP1:インストール系のコマンド  (1-2) STEP2:バージョンの適用/切り替え系のコマンド  (1-3) …

Anacondaのインストール手順(Windows 10の例)

  <目次> (1) Anacondaのインストール手順(Windows 10の例)  (1-1) STEP1:インストーラーの入手と起動  (1-2) STEP2:インストール  (1-3 …

Pythonのコンストラクタの基礎と「self」や「__init__」について

<目次> (1) Pythonのコンストラクタの基礎と「self」や「__init__」について  (1-1) 「__init__」やコンストラクタについて  (1-2) コンストラクタで使われる「s …

Pythonでcsvのカラム名・テーブルのレコードを取得する方法

今回PythonのPandasライブラリを用いてcsvファイルを読み込み、カラム名やテーブルのレコードを取得する方法をご紹介します。 <目次> (1) Pythonでcsvのカラム名・テーブルのレコー …

  • English (United States)
  • 日本語
Top