转换大熊猫数据帧到定制JSON格式(然后JS对象)

转换大熊猫数据帧到定制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_DH26origin(其似乎是由图上可以用于设置线颜色),我想不必切片行并手动替换符号。

使用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体验的人毫无疑问知道更好的方法。

+0

谢谢你,现在我只需要拿出'''符号出来 – Andreuccio

+0

好吧,这可能看起来很小巧,但'''和'''符号的使用似乎对'.js非常敏感'语法 我试过在你的脚本后面进行替换,但没有成功。基本上,我需要''EP_P1203_000000001'' - >''EP_P1203_000000001“','EP_P1203_000000002'' - >'”EP_P1203_000000002“'和所有其他'“'消失(即'” ach'' - >'ach',''north'' - >'north'等。) – Andreuccio

+1

我修改了我的答案我不知道你需要什么格式它。或者如果你是从控制台打印的话,我把它写到文件中了,另外,列的顺序是否重要? – Jarad