【问题标题】:pandas read_json: "If using all scalar values, you must pass an index"pandas read_json:“如果使用所有标量值,则必须传递一个索引”
【发布时间】:2016-11-17 18:14:22
【问题描述】:

我在使用 pandas 导入 JSON 文件时遇到了一些困难。

import pandas as pd
map_index_to_word = pd.read_json('people_wiki_map_index_to_word.json')

这是我得到的错误:

ValueError: If using all scalar values, you must pass an index

文件结构简化如下:

{"biennials": 522004, "lb915": 116290, "shatzky": 127647, "woode": 174106, "damfunk": 133206, "nualart": 153444, "hatefillot": 164111, "missionborn": 261765, "yeardescribed": 161075, "theoryhe": 521685}

来自华盛顿大学在 Coursera 上的机器学习课程。您可以找到文件here

【问题讨论】:

  • 这是一个熊猫问题,而不是 JSON 问题——在任何没有涉及熊猫的上下文中,您都不会遇到此特定错误,但是您可以在不涉及 JSON 的情况下获取此特定错误。
  • 例如,参见stackoverflow.com/questions/17839973/… -- 一个具有相同错误但不涉及 JSON 的问题。
  • 看起来你正在学习 Emily 的 ML 课程 :)
  • 它需要一个列表。因此,如果您这样做,它将起作用。 pd.DataFrame([{"biennials": 522004, "lb915": 116290}]).

标签: python json pandas


【解决方案1】:

试试

ser = pd.read_json('people_wiki_map_index_to_word.json', typ='series')

该文件仅包含键值对,其中值是标量。您可以使用ser.to_frame('count') 将其转换为数据框。

你也可以这样做:

import json
with open('people_wiki_map_index_to_word.json', 'r') as f:
    data = json.load(f)

现在数据是一个字典。您可以像这样将它传递给数据框构造函数:

df = pd.DataFrame({'count': data})

【讨论】:

    【解决方案2】:

    您可以像@ayhan 提到的那样做,这将为您提供列基本格式

    或者您可以将对象括在 [ ] (source) 中,如下所示,为您提供一种行格式,如果您正在加载多个值并计划为您的机器学习模型使用矩阵,这将很方便。

    df = pd.DataFrame([data])
    

    【讨论】:

      【解决方案3】:

      我认为发生的事情是

      中的数据
      map_index_to_word = pd.read_json('people_wiki_map_index_to_word.json')
      

      被读取为字符串而不是 json

      {"biennials": 522004, "lb915": 116290, "shatzky": 127647, "woode": 174106, "damfunk": 133206, "nualart": 153444, "hatefillot": 164111, "missionborn": 261765, "yeardescribed": 161075, "theoryhe": 521685}
      

      其实是

      '{"biennials": 522004, "lb915": 116290, "shatzky": 127647, "woode": 174106, "damfunk": 133206, "nualart": 153444, "hatefillot": 164111, "missionborn": 261765, "yeardescribed": 161075, "theoryhe": 521685}'
      

      由于字符串是标量,它希望您将其加载为 json,您必须将其转换为 dict,这正是其他响应正在执行的操作

      最好的方法是在字符串上加载一个 json 以将其转换为 dict 并将其加载到 pandas 中

      myfile=f.read()
      jsonData=json.loads(myfile)
      df=pd.DataFrame(data)
      

      【讨论】:

      • 谢谢你的解释,我已经找了一段时间了。
      【解决方案4】:
      {
      "biennials": 522004,
      "lb915": 116290
      }
      
      df = pd.read_json('values.json')
      

      因为 pd.read_json 需要一个列表

      {
      "biennials": [522004],
      "lb915": [116290]
      }
      

      对于特定的键,它会返回一个错误提示

      如果使用所有标量值,则必须传递一个索引。

      所以你可以通过在 pd.read_json 中指定 'typ' arg 来解决这个问题

      map_index_to_word = pd.read_json('Datasets/people_wiki_map_index_to_word.json', typ='dictionary')
      

      【讨论】:

        【解决方案5】:

        例如 cat values.json

        {
        name: "Snow",
        age: "31"
        }
        
        df = pd.read_json('values.json')
        

        你最终可能会得到这个 错误:如果使用所有标量值,则必须传递索引

        Pandas 在值中查找列表或字典。就像是 cat values.json

        {
        name: ["Snow"],
        age: ["31"]
        }
        

        所以尝试这样做。稍后转换为html tohtml()

        df = pd.DataFrame([pd.read_json(report_file,  typ='series')])
        result = df.to_html()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-19
          • 2018-05-29
          • 2018-12-04
          • 2021-11-06
          • 2023-01-24
          • 2020-03-19
          相关资源
          最近更新 更多