将 Pandas DataFrame 和元数据保存为 JSON 格式

Posted

技术标签:

【中文标题】将 Pandas DataFrame 和元数据保存为 JSON 格式【英文标题】:Saving Pandas DataFrame and meta-data to JSON format 【发布时间】:2016-01-11 18:34:20 【问题描述】:

我需要将 Pandas DataFrame 以及一些元数据保存到 JSON 格式的文件中。 (JSON 格式是必需的。)

背景A)我可以使用DataFrame.to_json()DataFrame.from_json() 成功地从/向JSON 读取/写入我相当大的Pandas Dataframe。没问题。

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 库不兼容。

我的第一个想法是寻找一种方法来修改 Cdf.to_dict() 输出,使其适合 Python 的 JSON 库,但我一直听到“如果你正在努力做某事在 Python 中,你可能做错了。”在我的脑海里。

问题 将元数据添加到 Pandas DataFrame 并存储到 JSON 格式文件的规范/推荐方法是什么?

Python 2.7.10 熊猫 0.17

编辑 1: 在尝试 Evan Wright 的出色答案时,我发现了问题的根源:Pandas(截至 0.17)不喜欢将多索引数据帧保存到 JSON。我为保存我的(多索引)DataFrames 而创建的库在调用DataFrame.to_json() 之前悄悄地执行df.reset_index()。我的新代码不是。所以它是 DataFrame.to_json() 在 MultiIndex 上打嗝。

课程:阅读文档孩子,即使它是您自己的文档。

编辑 2:

如果您需要将 DataFrame 和元数据都存储在 单个 JSON 对象中,请参阅下面的答案。

【问题讨论】:

【参考方案1】:

您应该能够将数据放在单独的行中。

写作:

f = open('test.json', 'w')
df.to_json(f)
print >> f
json.dump(metadata, f)

阅读:

f = open('test.json')
df = pd.read_json(next(f))
metdata = json.loads(next(f))

【讨论】:

在文件中写成两个单独的字符串。不错的技术。【参考方案2】:

在我的问题中,我错误地指出我需要文件中的 JSON。在这种情况下,埃文赖特的回答是我首选的解决方案。

就我而言,我实际上需要将 JSON 输出作为单个“blob”存储在数据库中,因此我的字典整理方法似乎是必要的。

如果您同样需要将数据和元数据存储在单个 JSON blob 中,则以下代码将起作用:

top_level_dict = 
top_level_dict['data'] = df.to_dict()
top_level_dict['metadata'] = 'some':'stuff'
with open(FILENAME, 'w') as outfile:
    json.dump(top_level_dict, outfile)

只要确保 DataFrame 是单索引的。如果是多索引,请在执行上述操作之前重置索引(即df.reset_index())。

读回数据:

with open(FILENAME, 'r') as infile:
    top_level_dict = json.load(infile)

df_as_dict = top_level_dict.pop('data', )
df = pandas.DataFrame().as_dict(df_as_dict)

meta = top_level_dict['metadata']

此时,您需要重新创建多索引(如果适用)

【讨论】:

这个答案很棒!关于读回数据,看起来 pandas API 发生了变化,目前应该使用from_dict 而不是as_dict

以上是关于将 Pandas DataFrame 和元数据保存为 JSON 格式的主要内容,如果未能解决你的问题,请参考以下文章

Python将Pandas中Dataframe数据保存为gzip/zip文件:gzip压缩文件zip压缩文件

将 Pandas DataFrame 保存为没有 pdfkit 的 PDF 文件格式

如何将本地 csv 文件的内容保存到“硬编码”Pandas DataFrame 中?

pandas使用read_csv读取数据使用skiprows参数跳过指定的数据行但保留表头pandas使用to_csv函数将dataframe保存为gzip压缩文件

将具有相同列/索引的两个 pandas DataFrame 合并为一个 DataFrame

在 Pandas Dataframe 中保存其他属性