2017-06-05 13 views
1

私は実験室に保管された化学元素の目録を返す2つの日付の間に大きなjsonを受け取ります。私が受け取る、次のコードにitem['date']を使用JSONから日付を得るためにデータをdf形式に整理しようとしています

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'}... 
    } 
    } 
] 

ElementDataはfollowinf構造と、JSON 1レシーブある

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

私の特定のjsonのために戻る:

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

一方、私はその日付に保管されている化学物質の量を調べたい要素のリストがあります。

list=['Potasium','Sodium'] 

与えられた日付の記載された要素の蓄積量を得るために、私が使用するコードは次のとおりです。

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

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 

私が直面しています問題与えられたデータでこのようなデータフレームを取得したいのです。

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

私が直面している主な問題は、データフレームに値を挿入することです。この問題を初めて処理しており、手順がわからないことがあります。

+1

[pd.read_json](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_json.html)はまったく役に立ちますか? orientパラメータでこれを行うことができます。 – Clusks

+0

'json'の例を共有できますか? – zipa

+0

@zipaもちろん1分 – ge00rge

答えて

2

あなたのデータには、3つの重要な機能、化学名、測定日、測定そのものが含まれているようです。

データフレームは、Seriesという小さなオブジェクトから構築できます。シリーズには、名前、値のセット、および各値を識別するためのインデックスがあります。これは悪い適合ではありません。

また、一連のシリーズを1つのデータフレームにまとめることができ、インデックスが整列していないときに何が起こるかをパンダが処理します。

したがって、シリーズを構成する1つの方法は、データから構築する一連の値を含む1組のリストとインデックスレコードを含むもう1組のリストを結合することです。しかし、本質的に、それはの組み合わせだ -

その最終ラインで起こってたくさんあります
chemical_df = pd.concat([sodium_series, potassium_series],axis=1).rename(columns={0:'Sodium',1:'Potassium'}) 

は:あなたのデータフレームを形成するために組み合わせることができ、一連のオブジェクトのペアを与える

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) 

系列が列を表すことを指定する2つの系列(軸= 0は、それらを4つのレコードのリストとしてエンド・ツー・エンドで結合しようとする)、列名をデフォルトの0,1,2、...の値から適切な英語名。

上記の例では、測定値のインデックス(日付)が2つの異なる測定値セットに揃えられていますが、ずれがあった場合、読み取り値が異なるか、 pandasはまだデータフレームを作成しますが、デフォルトでNaNで欠損値を埋め込みます。

関連する問題