Python 无法将JSON转换为熊猫。所有数据都包含在一行中。我如何打开它?

Python 无法将JSON转换为熊猫。所有数据都包含在一行中。我如何打开它?,python,json,pandas,nested,flatten,Python,Json,Pandas,Nested,Flatten,然而,我试图将JSON文件转换为pandas数据帧,虽然列看起来正确,但所有数据都包含在一行中,而不是我希望它是一个以“财政年度”为索引的时间序列 将熊猫作为pd导入 将numpy作为np导入 导入urllib.request,json 从pandas.io.json导入json_规范化 response=urllib.request.urlopen('https://api.gurufocus.com/public/user/f97abc68a0f96617ccea854faeff6db:ca

然而,我试图将JSON文件转换为pandas数据帧,虽然列看起来正确,但所有数据都包含在一行中,而不是我希望它是一个以“财政年度”为索引的时间序列

将熊猫作为pd导入
将numpy作为np导入
导入urllib.request,json
从pandas.io.json导入json_规范化
response=urllib.request.urlopen('https://api.gurufocus.com/public/user/f97abc68a0f96617ccea854faeff6db:ca86e5ff8d37550212f9c7d45645d413/stock/WMT/financials')
content=response.read()
data=json.load(content.decode('utf8'))
数据=(数据['financials']['annuals'])
数据=json_规范化(数据)
df=pd.DataFrame(数据)
df=pd.io.json.json\u规范化(数据)
打印(df)

输出似乎是一个df,列看起来是正确的,但只有一行,每个列应该至少有30个唯一年份。如有任何建议,将不胜感激

这远远超出了pandas自动Json处理的功能:您的Json是一个复杂的结构,最多有两个关键级别,只有大小为30或31的列表

在这一点上,忘记json_规范化,开始手动解析

首先,将字典展平:

def flatten(data):
    flat = {}
    for k, v in data.items():
        if isinstance(v, dict):
            for j, u in flatten(v).items():
                flat[k+'-'+j] = u
        else:
            flat[k] = v
    return flat

data2 = flatten(data)
控制我们现在有一个列表的目录,并控制列表的大小:

c = collections.Counter()
for k,v in data2.items():
    if isinstance(v, list):
        c[len(v)] += 1
    else:
        print('============', k, type(v))
好的,只有31个元素的列表,只有一个除外:添加一个
None
使所有列表长度相等:

for k,v in data2.items():
    if len(v) == 30:
        v.append(None)
我们现在有了一个等长列表字典:这适合于构建数据框架:

df = pd.DataFrame(data2)

您能提供一个数据样本以便于复制吗?谢谢您查看Serge。我在“flat=”行之后立即插入您的代码,并收到以下错误消息。。。名称错误:未定义名称“集合”
collections
是标准库中的包。只需在使用前添加
导入集合
。效果很好。谢谢!