2015-10-13 97 views
2

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

背景
A)我可以成功读取/使用DataFrame.to_json()DataFrame.from_json()/JSON来写我相当大的熊猫数据帧。没问题。

B)我没有问题救了我的元数据(字典),以JSON使用json.dump()/json.load()


我第一次尝试
由于大熊猫不直接支持数据帧的元数据,我首先想到的是到

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) 

所以看来熊猫JSON格式和Python的JSON库是不兼容的。

我首先想到的是追跌的方式来修改df.to_dict()输出Ç,使其适合于Python的JSON库,但我不断听到“如果你努力做一些事情在Python,你可能做错了。“在我的脑子里。


问题
什么是添加元数据到数据帧的熊猫和存储到一个JSON格式文件cannonical /推荐的方法?

的Python 2.7.10
熊猫0.17

编辑1:
虽然尝试了埃文莱特的伟大答案,我发现我的问题的根源:熊猫(截至0.17)不喜欢储蓄多索引数据框到JSON。在调用DataFrame.to_json()之前,我为保存我的(多重索引)数据帧而创建的库在安静地执行df.reset_index()。我的新代码不是。所以这是DataFrame.to_json()打在MultiIndex上。

教训:阅读文档的孩子,即使它是你自己的文档。

编辑2:

如果需要同时存储数据帧,并在 JSON对象的元数据,请参阅我的回答如下。

回答

2

你应该能够把数据放在不同的行上。

写作:

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)) 
+0

写在文件中两个独立的字符串。好的技术。 –

1

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

在我的情况下,我实际上需要将JSON输出作为单个“blob”存储在数据库中,所以我的字典拼写方法似乎是必需的。

如果你同样需要数据和元数据存储在一个单一的JSON斑点,下面的代码将工作:

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) 

只要确保数据帧的单独索引。如果是多重索引,则在执行上述操作之前重置索引(即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'] 

在这一点上,你需要重新创建多指标(如适用)

相关问题