2017-08-27 113 views
-1

我有一個數據框,我從json url創建。它有兩列,bpi和時間。 bpi值是前三行的字典,時間值是NaN。最後三行是用於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 

我只想從美元字典rate,加上從timeupdated值。

輸出應該是每一個日期值 - 其次,列出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,你可以只需使用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

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,但仍然 - 這缺乏一個重要的功能。我想要做的是創建一個csv文件,不斷更新新的值,而不會覆蓋舊的值....是否有一種方便的方法來做到這一點?我最終會編程腳本每分鐘自動運行,並且csv應該每次增長...但是,我從中拉出的json文件將始終只生成一行 – zsad512

1

在我看來,最好是從dict S創建新列:

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

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