2015-10-13 662 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'] 

在這一點上,你需要重新創建多指標(如適用)

相關問題