2017-06-05 1 views
1

Ich erhalte einen großen JSON unter 2 Daten, die das Inventar einiger chemischer Elemente in einem Labor gespeichert zurückgibt.Versuchen, Daten in df Form zu organisieren

ElementData ist die json 1 recieve, mit der followinf Struktur:

ElementData= [{'_id': '', 'date': '2017-06-01T00:00:00.000Z', 'values': {'Boron': 
{'amount': 58.67,'time': '15:40:02'}, 'Cobalt': 
{'amount': '108.25', 'time': '11:35:39'}, 'Fluorine': 
{'amount': '13.25','time': '09:38:48'}, 
'silver': {'amount': '200.89', 'time': 
'13:28:14'}, 'chronium': {'amount': '10.22', 
'time': '14:00:30'}... 
    } 
    } 
] 

Um die Daten aus dem json I item['date'] im folgenden Code verwenden, zu erhalten, ich empfange:

dates=[] 
for item in ElementData: 
    dates.append((item['date'])[0:10]) 
print(dates) 

Zurück zu meinem bestimmten JSON:

['2017-06-01', '2017-06-02'] 

Auf der anderen Seite ich habe eine Liste von Elementen, aus denen ich die chemischen Mengen finden möchte, die diese Daten gespeichert haben.

list=['Potasium','Sodium'] 

Um die gespeicherten Mengen der aufgeführten Elemente für die angegebenen Daten zu erhalten, wird der Code ich benutze, ist:

for elements in list: 
    for item in ElementData: 
     print (elements + ' amount for date ' +item['date'][0:10]+ ' was:' + str(item['values'][elements]['amount'])) 

Rückkehr der folgende:

potassium amount for date 2017-06-01 was:12.19 
potassium amount for date 2017-06-02 was:10.07 
sodium amount for date 2017-06-01 was:7.22 
sodium amount for date 2017-06-02 was:30.07 

Das Problem, das ich bin vor ist, dass ich mit den gegebenen Daten einen Datenrahmen wie diesen erhalten möchte:

   Potasium Sodium  
2017-06-02  10.07  30.07    
2017-06-01  12.19  7.22 

Das Hauptproblem, mit dem ich konfrontiert bin, ist, die Werte in den Datenrahmen einzufügen, es ist das erste Mal, dass ich mich mit diesem Problem befasse und nicht sicher bin, welche Schritte zu folgen sind.

+1

Würde [pd.read_json] (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_json.html) überhaupt helfen? Der Orient-Parameter kann dies möglicherweise tun. – Clusks

+0

Können Sie Ihr 'json' Beispiel teilen? – zipa

+0

@zipa natürlich 1 min – ge00rge

Antwort

2

Die Daten, die Sie haben, scheinen 3 wichtige Merkmale, den chemischen Namen, das Datum einer Messung und die Messung selbst zu enthalten.

Ein Datenrahmen kann aus kleineren Objekten, die als Serie bezeichnet werden, erstellt werden. Eine Reihe hat einen Namen, eine Menge von Werten und einen Index, der zur Identifizierung jedes Wertes verwendet wird - also ist es nicht schlecht.

Was zusätzlich hilfreich ist, ist, dass Sie eine Reihe von Serien zu einem Datenrahmen kombinieren können, und Pandas werden sich darum kümmern, was passiert, wenn die Indizes nicht übereinstimmen.

So eine Möglichkeit, eine Serie zu erstellen, besteht darin, ein Paar Listen zu kombinieren, von denen eine die Menge der Werte enthält, die Sie aus Ihren Daten erstellen, und die andere die Indexdatensätze enthält.

import pandas as pd 

sodium = [ 7.22, 30.07 ] 
sodium_index = [ '2017-06-01', '2017-06-02' ] 
potassium = [12.19, 10.07] 
potassium_index = [ '2017-06-01', '2017-06-02' ] 

sodium_series = pd.Series(sodium, index=sodium_index) 
potassium_series = pd.Series(potassium, index=potassium_index) 

Welche Ihnen ein Paar Reihenobjekte gibt, die kombiniert werden können einen Datenrahmen zu bilden:

chemical_df = pd.concat([sodium_series, potassium_series],axis=1).rename(columns={0:'Sodium',1:'Potassium'}) 

viel in der letzten Zeile los Es gibt - aber im Grunde ist es eine Kombination aus dem zwei Reihen, die angeben, dass die Reihe Spalten darstellt (Achse = 0 würde versuchen, sie Ende-zu-Ende als eine Liste von 4 Datensätzen zu kombinieren) und die Spaltennamen von ihren Standardwerten 0,1,2, ... auf die Werte setzen geeignete englische Namen.

In dem obigen Beispiel ist der Index (Datum) der Messungen über die zwei verschiedenen Sätze von Messungen ausgerichtet, aber wenn es eine Fehlausrichtung gab, sagen Sie, dass Sie eine andere Anzahl von Lesungen oder unterschiedliche Daten für die Messwerte hatten, Pandas werden weiterhin den Datenrahmen erstellen, aber die fehlenden Werte (standardmäßig) mit NaN ausfüllen.

Verwandte Themen