2017-08-27 9 views
-1

私はjsonのURLから作成したデータフレームを持っています。 bpiと時間の2つの列があります。 bpi値は最初の3行のディクショナリであり、時間値はNaNです。最後の3行は、bpiのNaNと時間の時限値です。私は行3、列1、行4列2を返したいと思います。複雑な部分は、行3、列1-から、辞書から特定のキー、値のペアだけを選択したいということです。これどうやってするの?データフレームから特定の値を選ぶ?

[in] print(btc) 
[out] 
                  bpi \ 
EUR   {'code': 'EUR', 'symbol': '€', 'rate': '3... 
GBP   {'code': 'GBP', 'symbol': '£', 'rate': '... 
USD   {'code': 'USD', 'symbol': '$', 'rate': '4,... 
updated             NaN 
updatedISO            NaN 
updateduk             NaN 

           time 
EUR        NaN 
GBP        NaN 
USD        NaN 
updated  Aug 27, 2017 14:07:00 UTC 
updatedISO 2017-08-27T14:07:00+00:00 
updateduk Aug 27, 2017 at 15:07 BST 

私はUSD辞書、プラスtime列からupdated値からrateをしたいです。 DFは、あなたが、パンダ.to_dict

[in] 
btc_dict = btc.to_dict() 

print(btc_dict) 
[out] 
{'bpi': {'EUR': {'code': 'EUR', 'symbol': '€', 'rate': '3,671.8281', 'description': 'Euro', 'rate_float': 3671.8281}, 'GBP': {'code': 'GBP', 'symbol': '£', 'rate': '3,397.8616', 'description': 'British Pound Sterling', 'rate_float': 3397.8616}, 'USD': {'code': 'USD', 'symbol': '$', 'rate': '4,378.8400', 'description': 'United States Dollar', 'rate_float': 4378.84}, 'updated': nan, 'updatedISO': nan, 'updateduk': nan}, 'time': {'EUR': nan, 'GBP': nan, 'USD': nan, 'updated': 'Aug 27, 2017 14:07:00 UTC', 'updatedISO': '2017-08-27T14:07:00+00:00', 'updateduk': 'Aug 27, 2017 at 15:07 BST'}} 
+0

あなたがあなたの希望の方法を教えている場合それは参考になります出力が –

+0

のように表示されます。希望の出力形式を追加しました。実際の表示方法を表示できませんでした。 – zsad512

+0

'df.to_dict()'を印刷してここに貼り付けることができますか?あなたのデータはコピーペーストではなく、私たちはそれを扱うことができません。 –

答えて

1

IIUCを可能性が使用して変更されたときに

出力はここrate

を一覧表示欄が続く付加価値のすべての日付の1行でなければなりませんが出力されますちょうどそのように、df.locを使用して、これらの値にアクセスします。

r = df.loc['USD', 'bpi']['rate'] 
y = df.loc['updated', 'time'] 

df = pd.DataFrame({'btc_price (USD)': [r], 'time' : [y]}) 
print(df) 

    btc_price (USD)      time 
0  4,378.8400 Aug 27, 2017 14:07:00 UTC 

をCSVに保存するには、を使用したいです:

df.to_csv('out.csv') 

あなたが将来的に同じデータフレームに追加する必要がある場合は、あなたが最初に新しいデータフレームを作成し、既存のCSVファイルに追加したい:

df_new = pd.DataFrame([[new_rate, new_time]], columns=['btc_price (USD)', 'time']) 
with open('out.csv', 'a') as f: 
    df_new.to_csv(f, header=False) 
+0

どのようにこれらの値をリストや辞書に入れることができますか?私の目標は、最初の録音から始めて、URLリクエストが – zsad512

+0

@ zsad512と呼ばれるたびにcsvに新しい行を追加することです。 –

+0

@ COLDSPEEDありがとうございますが、これは1つの重要な機能が欠けています。私がしたいのは、古い値を上書きせずに常に新しい値で更新されているCSVファイルを作成することです。これを行う便利な方法はありませんか?私は最終的に毎分自動的に実行するスクリプトをプログラミングする予定であり、csvは毎回大きくなるはずです...しかし、私が引っ張っているjsonファイルは常に1つの行しか生成しません – zsad512

1

私の意見では

d = {'bpi': {'EUR': {'code': 'EUR', 'symbol': '€', 'rate': '3,671.8281', 'description': 'Euro', 'rate_float': 3671.8281}, 'GBP': {'code': 'GBP', 'symbol': '£', 'rate': '3,397.8616', 'description': 'British Pound Sterling', 'rate_float': 3397.8616}, 'USD': {'code': 'USD', 'symbol': '$', 'rate': '4,378.8400', 'description': 'United States Dollar', 'rate_float': 4378.84}, 'updated': np.nan, 'updatedISO': np.nan, 'updateduk': np.nan}, 'time': {'EUR': np.nan, 'GBP': np.nan, 'USD': np.nan, 'updated': 'Aug 27, 2017 14:07:00 UTC', 'updatedISO': '2017-08-27T14:07:00+00:00', 'updateduk': 'Aug 27, 2017 at 15:07 BST'}} 

:最高の dict sから新しい列を作成することです
df = pd.DataFrame(d) 
#replace NaNs to {} 
df['bpi'] = df['bpi'].fillna(pd.Series([{}], index=df.index)) 

#new df by constructor, join column time last 
df1 = pd.DataFrame(df['bpi'].values.tolist(), index=df.index).join(df['time']) 
#convert rate column to float 
df1['rate'] = df1['rate'].replace(',','',regex=True).astype(float) 
#convert time column to datetimes 
df1['time'] = pd.to_datetime(df1['time']) 
print (df1) 
      code    description  rate rate_float symbol \ 
EUR   EUR     Euro 3671.8281 3671.8281 € 
GBP   GBP British Pound Sterling 3397.8616 3397.8616 £ 
USD   USD United States Dollar 4378.8400 4378.8400 $ 
updated  NaN      NaN  NaN   NaN  NaN 
updatedISO NaN      NaN  NaN   NaN  NaN 
updateduk NaN      NaN  NaN   NaN  NaN 

          time 
EUR      NaT 
GBP      NaT 
USD      NaT 
updated 2017-08-27 14:07:00 
updatedISO 2017-08-27 14:07:00 
updateduk 2017-08-27 15:07:00 

か、可能であれば元のJSONデータをこのsolutionに似json_normalizeを使用します。

df = json_normalize(d) 
print (df) 

最終フィルタboolean indexingによって:

#sample 
df3 = df1[(df1['code'] == 'EUR') & (df1['rate'] > 1000)] 
print (df3) 
    code description  rate rate_float symbol time 
EUR EUR  Euro 3671.8281 3671.8281 € NaT 
関連する問題