2017-05-23 9 views
1

Ich habe ein Pandas Datenrahmen mit Multiindex Ebenen, die wie folgt aussieht:Format Datenrahmen rudern orientierte JSON-Objekt (Tabelle Stil Pivot-Tabelle)

enter image description here

Und jetzt versuche ich zu konvertieren dieser Datenrahmen in ein zeilenorientierte JSON-Objekt (oder spreadsheet-style pivot table?), wobei das Ergebnis wie folgt aussehen soll:

[{"date":"2016-11-08T23:00:00.000Z", "flag":0, "value":545.0, "moduleId":"module_A","parameterId":"parameter_B", "locationId":"location_1" }, 
{"date":"2016-11-09T23:00:00.000Z", "flag":0, "value":545.0, "moduleId":"module_A","parameterId":"parameter_B", "locationId":"location_1" }, 
{"date":"2016-11-10T23:00:00.000Z", "flag":8, "value":-999.0, "moduleId":"module_A","parameterId":"parameter_B", "locationId":"location_1" }, 
{"date":"2016-11-11T23:00:00.000Z", "flag":0, "value":680.0, "moduleId":"module_A","parameterId":"parameter_B", "locationId":"location_1" }, 
{"date":"2016-11-12T23:00:00.000Z", "flag":8, "value":-999.0, "moduleId":"module_A","parameterId":"parameter_B", "locationId":"location_1" }] 

ich hat versucht, den folgenden Befehl

zu verwenden,
df.reset_index().to_json(orient='records', date_format='iso') 

aber dann bleibt die Struktur MultiIndex intakt.

würde sehr geschätzt
import pandas as pd 
from pandas import Timestamp 

input_dict = {('module_A', 
    'parameter_B', 
    'location_1', 
    'flag'): { Timestamp('2016-11-09 05:30:00+0630', tz='Asia/Yangon'): 0, 
    Timestamp('2016-11-10 05:30:00+0630', tz='Asia/Yangon'): 0, 
    Timestamp('2016-11-11 05:30:00+0630', tz='Asia/Yangon'): 8, 
    Timestamp('2016-11-12 05:30:00+0630', tz='Asia/Yangon'): 0, 
    Timestamp('2016-11-13 05:30:00+0630', tz='Asia/Yangon'): 8}, 
('module_A', 
    'parameter_B', 
    'location_1', 
    'value'): { Timestamp('2016-11-09 05:30:00+0630', tz='Asia/Yangon'): 545.0, 
    Timestamp('2016-11-10 05:30:00+0630', tz='Asia/Yangon'): 545.0, 
    Timestamp('2016-11-11 05:30:00+0630', tz='Asia/Yangon'): -999.0, 
    Timestamp('2016-11-12 05:30:00+0630', tz='Asia/Yangon'): 680.0, 
    Timestamp('2016-11-13 05:30:00+0630', tz='Asia/Yangon'): -999.0}} 

df = pd.DataFrame(input_dict) 

Jeder Vorschlag:

Das oben verwendete Dummy-Set kann wie folgt erstellt werden.

Antwort

1

Sie benötigen stack + rename_axis zuerst:

df = df.stack([0,1,2]).rename_axis(['date','moduleId','parameterId','locationId']) 
d = df.reset_index().to_json(orient='records', date_format='iso') 
print (d) 

[{"date":"2016-11-08T23:00:00.000Z","moduleId":"module_A","parameterId":"parameter_B","locationId":"location_1","flag":0,"value":545.0}, 
{"date":"2016-11-09T23:00:00.000Z","moduleId":"module_A","parameterId":"parameter_B","locationId":"location_1","flag":0,"value":545.0}, 
{"date":"2016-11-10T23:00:00.000Z","moduleId":"module_A","parameterId":"parameter_B","locationId":"location_1","flag":8,"value":-999.0}, 
{"date":"2016-11-11T23:00:00.000Z","moduleId":"module_A","parameterId":"parameter_B","locationId":"location_1","flag":0,"value":680.0}, 
{"date":"2016-11-12T23:00:00.000Z","moduleId":"module_A","parameterId":"parameter_B","locationId":"location_1","flag":8,"value":-999.0}] 
+0

Wow! Das ist noch weniger Code, als ich erwartet habe. Kann sogar ein One-Liner sein. Das ist toll – Mattijn