pandas read_json:如果使用所有标量值,则必须传递索引

cwdobuhd  于 2023-04-08  发布在  其他
关注(0)|答案(8)|浏览(133)

我在导入带有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

q35jwt9p

q35jwt9p1#

试试看

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

该文件只包含值为标量的键值对。您可以使用ser.to_frame('count')将其转换为 Dataframe 。
你也可以这样做:

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

现在data是一个字典。你可以像这样将它传递给dataframe构造函数:

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

qxgroojn2#

你可以像@ayhan提到的那样做,这会给予你一个列基格式

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

df = pd.DataFrame([data])

sqxo8psd

sqxo8psd3#

我认为现在的情况是

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)
ohfgkhjo

ohfgkhjo4#

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

df = pd.read_json('values.json')

如pd.read_json期望列表

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

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

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

因此,您可以通过在www.example.com _json中指定'typ' arg来解决此问题pd.read

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

mkh04yzy5#

对于较新的pandas,0.19.0及更高版本,使用lines参数,将其设置为True。文件将作为每行的json对象读取。

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

如果修复了我遇到的以下错误,特别是当一些json文件只有一个值时:

  1. ValueError:如果使用所有标量值,则必须传递索引
  2. JSONDecodeError:预期值:第1行第1列(字符0)
  3. ValueError:跟踪数据
djp7away

djp7away6#

例如cat values.json

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

df = pd.read_json('values.json')

您可能会遇到以下错误:如果使用所有标量值,则必须传递索引
Pandas在值中查找列表或字典,类似于catvalues.json

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

所以试着这样做。

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

gkn4icbw7#

我把它转换成一个数组来解决这个问题

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

0kjbasz68#

一个完整的工作示例

首先,我将你发布的数据保存在一个json文件中:

import json
import pandas as pd

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

save_fpath = '/content/sample_file.json'
with open(save_fpath, 'w') as f:
    json.dump(json_data, f)

然后,使用method proposed by obiradaniel,可以通过以下代码获得pandas Dataframe :

sample_df = pd.read_json(save_fpath, lines=True).T.reset_index()
sample_df.columns = ['col_1', 'col_2']
sample_df

基本上,使用lines=Truejson_data字典的键转换为列名。为此,我将 Dataframe 转置(列名变为索引名),然后重置索引。最后,分配新的列名。
使用orient参数可以跳过转置步骤。这样,json_data字典的键将作为索引名称从一开始读取。下面是一个使用该参数的示例:

sample_df = pd.read_json(save_fpath, orient='index').reset_index()
sample_df.columns = ['col_1', 'col_2']
sample_df

在这两种方式中,得到的 Dataframe 如下:
| | col_1|col_2|
| --------------|--------------|--------------|
| 0|双年展|五二零零四|
| 1|lb915|一一六二九零|
| 二|哈茨基|127647|
| 三|伍德|174106|
| 四|达姆丰克|133206|
| 五|努拉特|153444|
| 六|哈特菲约|164111|
| 七|传教士出身的|二六一七六五|
| 八|年描述|161075|
| 九|理论|五二一六八五|

相关问题