熊猫数据框到JSON的字典

qwe*_*lpc 4 python json pandas

正如问题所问,我有一个要保存的熊猫数据帧字典,这样下次我启动ipython笔记本时就不必重新采样数据了。我尝试过一些简单的方法,该方法以前在其他情况下都可以使用:

import json
with open('result.json', 'w') as fp:
    json.dump(d, fp)
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个错误:

[1001 rows x 6 columns] is not JSON serializable
Run Code Online (Sandbox Code Playgroud)

我认为这与我的熊猫数据框有关,但是任何帮助将不胜感激

小智 7

虽然上述工作正常,但序列化的数据帧作为嵌入字符串进入 json。如果你想要漂亮的 json,首先将数据帧转换为字典,然后使用普通的 json 接口编写。从磁盘读取后,您将转换回数据帧:

# data is dictionary of dataframes

import json

# convert dataframes into dictionaries
data_dict = {
    key: data[key].to_dict(orient='records') 
    for key in data.keys()
}

# write to disk
with open('data_dict.json', 'w') as fp:
    json.dump(
        data_dict, 
        fp, 
        indent=4, 
        sort_keys=True
    )

# read from disk
with open('data_dict.json', 'r') as fp:
    data_dict = json.load(fp)

# convert dictionaries into dataframes
data = {
    key: pd.DataFrame(data_dict[key]) 
    for key in data_dict
}
Run Code Online (Sandbox Code Playgroud)


hel*_*err 5

您需要扩展JSON编码器,以便它知道如何序列化数据帧。示例(使用to_json方法):

import json
class JSONEncoder(json.JSONEncoder):
    def default(self, obj):
        if hasattr(obj, 'to_json'):
            return obj.to_json(orient='records')
        return json.JSONEncoder.default(self, obj)
Run Code Online (Sandbox Code Playgroud)

保存:

with open('result.json', 'w') as fp:
    json.dump({'1':df,'2':df}, fp, cls=JSONEncoder)
Run Code Online (Sandbox Code Playgroud)

现在,如果您愿意

json.load(open('result.json')
Run Code Online (Sandbox Code Playgroud)

您将获得包含数据框的字典。您可以使用加载它们

pd.read_json(json.load(open('result.json'))['1'])
Run Code Online (Sandbox Code Playgroud)