转换大熊猫数据帧到定制JSON格式(然后JS对象)
问题描述:
我想绘制使用平行的某些分析结果的坐标图。已经发现使用protovis http://mbostock.github.io/protovis/ex/cars.html,我试图重新安排我的数据复制数据文件的结构,每例(cars.js
)做出了光辉的榜样。 因此,我的dataframe
结构:转换大熊猫数据帧到定制JSON格式(然后JS对象)
north ch wwr ach tmin tmax B1_EMS_DH26
Job_ID
EP_P1203_000000000 0.0 2.5 40 4.0 24 25 1272.2
EP_P1203_000000001 0.0 2.5 40 4.0 24 26 1401.9
EP_P1203_000000002 0.0 2.5 40 4.0 24 27 1642.3
应该被转换为以下:
var results = [
{name:"EP_P1203_000000000", north:0.0, ch:2.5, wwr:40, ach:4.0, tmin:24, tmax:25, origin:1272.2},
{name:"EP_P1203_000000001", north:0.0, ch:2.5, wwr:40, ach:4.0, tmin:24, tmax:26, origin:1401.9},
{name:"EP_P1203_000000002", north:0.0, ch:2.5, wwr:40, ach:4.0, tmin:24, tmax:27, origin:1272.3},
{name:"EP_P1203_000000003", north:0.0, ch:2.5, wwr:40, ach:4.0, tmin:24, tmax:28, origin:1642.3},
];
除了更换我的柱B1_EMS_DH26
成origin
(其似乎是由图上可以用于设置线颜色),我想不必切片行并手动替换符号。
使用dataframe.to_json
命令返回一行:
{"EP_P1203_000000000":{"north":0.0,"ch":2.5,"wwr":40,"ach":4.0,"tmin":24,"tmax":25,"B1_EMS_DH26":1272.2},"EP_P1203_000000001":{"north":0.0,"ch":2.5,"wwr":40,"ach":4.0,"tmin":24,"tmax":26,"B1_EMS_DH26":1401.9},"EP_P1203_000000002":{"north":0.0,"ch":2.5,"wwr":40,"ach":4.0,"tmin":24,"tmax":27,"B1_EMS_DH26":1642.3}}
它仍然是不完全正确。 你如何建议去做这件事?
答
你的数据框(用于娱乐目的):
df= pd.DataFrame(
{'north': [0.0, 0.0, 0.0],
'B1_EMS_DH26': [1272.2, 1401.9, 1642.3],
'tmax': [25, 26, 27],
'wwr': [40, 40, 40],
'ch': [2.5, 2.5, 2.5],
'tmin': [24, 24, 24],
'ach': [4.0, 4.0, 4.0]
},
index=['EP_P1203_000000000', 'EP_P1203_000000001', 'EP_P1203_000000002'],
columns=['north', 'ch', 'wwr', 'ach', 'tmin', 'tmax', 'B1_EMS_DH26'])
这可能是最糟糕的方式做到这一点,但它的工作原理(我认为):
import re
import json
with open('whatever.json', 'w') as f:
f.write('var results = [\n')
for k,v in df.drop('B1_EMS_DH26', axis=1).T.to_dict().items():
f.write("{name:"+json.dumps(k)+", "+re.sub(r'[{"\']', '', json.dumps(v))+',\n')
f.write('];')
产地:
var results = [
{name:"EP_P1203_000000001", ach: 4.0, north: 0.0, tmax: 26.0, tmin: 24.0, ch: 2.5, wwr: 40.0},
{name:"EP_P1203_000000000", ach: 4.0, north: 0.0, tmax: 25.0, tmin: 24.0, ch: 2.5, wwr: 40.0},
{name:"EP_P1203_000000002", ach: 4.0, north: 0.0, tmax: 27.0, tmin: 24.0, ch: 2.5, wwr: 40.0},
];
它将输出我认为你正在寻找的结构的文件。如果没有,请告诉我。我知道可怕的黑客攻击。拥有先进json体验的人毫无疑问知道更好的方法。
谢谢你,现在我只需要拿出'''符号出来 – Andreuccio
好吧,这可能看起来很小巧,但'''和'''符号的使用似乎对'.js非常敏感'语法 我试过在你的脚本后面进行替换,但没有成功。基本上,我需要''EP_P1203_000000001'' - >''EP_P1203_000000001“','EP_P1203_000000002'' - >'”EP_P1203_000000002“'和所有其他'“'消失(即'” ach'' - >'ach',''north'' - >'north'等。) – Andreuccio
我修改了我的答案我不知道你需要什么格式它。或者如果你是从控制台打印的话,我把它写到文件中了,另外,列的顺序是否重要? – Jarad