我需要将一个Pandas DataFrame和一些元数据保存为JSON格式的文件。(JSON格式是必需的。)
背景
A) 我可以使用 DataFrame.to_json()
和 DataFrame.from_json()
成功地读取/写入我的相当大的Pandas Dataframe到JSON中。没有问题。
B) 我没有问题,可以使用 json.dump()
/json.load()
将我的元数据(dict)保存到JSON中。
我的第一次尝试
由于Pandas不直接支持DataFrame元数据,我的第一个想法是
top_level_dict = {}
top_level_dict['data'] = df.to_dict()
top_level_dict['metadata'] = {'some':'stuff'}
json.dump(top_level_dict, fp)
故障模式
C) 我发现即使是简化的情况也存在以下问题:
df_dict = df.to_dict()
json.dump(df_dict, fp)
出现以下错误:
TypeError: key (u'US', 112, 5, 80, 'wl') is not a string
D) 调查后发现,补语也失败了。
df.to_json(fp)
json.load(fp)
出现故障
384 raise ValueError("No JSON object could be decoded")
ValueError: Expecting : delimiter: line 1 column 17 (char 16)
看起来Pandas的JSON格式和Python的JSON库不兼容。
我的第一个想法是追寻一种方法修改C的df.to_dict()输出,使其适用于Python的JSON库,但我在脑海中一直听到“如果你在Python中做某件事感到困难,那么你可能正在错误地做这件事。”。
问题:向Pandas DataFrame添加元数据并将其存储为JSON格式文件的规范/推荐方法是什么?
Python 2.7.10 Pandas 0.17
编辑1: 在尝试Evan Wright的好答案时,我发现了问题的根源:Pandas(截至0.17)不喜欢将多索引DataFrame保存为JSON。 我创建的库可以保存我的(多索引)DataFrame,在调用DataFrame.to_json()之前安静地执行df.reset_index()。我的新代码没有这样做。因此,它是由于MultiIndex而出现问题。
教训:孩子们,即使是你自己的文档,也要阅读文档。
编辑2: 如果您需要在单个JSON对象中存储DataFrame和元数据,请参见我的下面的答案。