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)
您需要扩展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)