Appending error from dictionary to Dataframe

Viewed 44

I am trying to extract data from a Dictionary into a df and finally into a CSV and I need to fill rows. Also 'res' gets changed every other second as it is fetching data from an API.

This is what I have tried:

for x in range(0,5):
  df1 = df1.append({'bidsize':res["Bids"][x]["Size"]}, ignore_index= True)
  df1 = df1.append({'bidprice':res["Bids"][x]["Price"]}, ignore_index= True)
  df1 = df1.append({'bid_to':res["Bids"][x]["TotalOrders"]}, ignore_index= True)
  df1 = df1.append({'bid_buyback':res["Bids"][x]["BuyBackMarketMaker"]}, ignore_index= True)
  df1 = df1.append({'asksize':res["Asks"][x]["Size"]}, ignore_index= True)
  df1 = df1.append({'askprice':res["Asks"][x]["Price"]}, ignore_index= True)
  df1 = df1.append({'ask_to':res["Asks"][x]["TotalOrders"]}, ignore_index= True)
  df1 = df1.append({'ask_buyback':res["Asks"][x]["BuyBackMarketMaker"]}, ignore_index= True)
print(df1)

It gives:

    bidsize  bidprice  bid_to  bid_buyback  asksize  askprice  ask_to  ask_buyback
0    1044.0       NaN     NaN          NaN      NaN       NaN     NaN          NaN
1       NaN   2142.00     NaN          NaN      NaN       NaN     NaN          NaN
2       NaN       NaN     8.0          NaN      NaN       NaN     NaN          NaN
3       NaN       NaN     NaN          0.0      NaN       NaN     NaN          NaN
4       NaN       NaN     NaN          NaN    247.0       NaN     NaN          NaN
5       NaN       NaN     NaN          NaN      NaN   2142.50     NaN          NaN
6       NaN       NaN     NaN          NaN      NaN       NaN     2.0          NaN
7       NaN       NaN     NaN          NaN      NaN       NaN     NaN          0.0
8       2.0       NaN     NaN          NaN      NaN       NaN     NaN          NaN
9       NaN   2141.90     NaN          NaN      NaN       NaN     NaN          NaN
10      NaN       NaN     2.0          NaN      NaN       NaN     NaN          NaN
11      NaN       NaN     NaN          0.0      NaN       NaN     NaN          NaN
12      NaN       NaN     NaN          NaN      8.0       NaN     NaN          NaN
13      NaN       NaN     NaN          NaN      NaN   2142.70     NaN          NaN
14      NaN       NaN     NaN          NaN      NaN       NaN     1.0          NaN
15      NaN       NaN     NaN          NaN      NaN       NaN     NaN          0.0
16     47.0       NaN     NaN          NaN      NaN       NaN     NaN          NaN
17      NaN   2141.85     NaN          NaN      NaN       NaN     NaN          NaN
18      NaN       NaN     1.0          NaN      NaN       NaN     NaN          NaN
19      NaN       NaN     NaN          0.0      NaN       NaN     NaN          NaN
20      NaN       NaN     NaN          NaN    495.0       NaN     NaN          NaN
21      NaN       NaN     NaN          NaN      NaN   2142.75     NaN          NaN
22      NaN       NaN     NaN          NaN      NaN       NaN     2.0          NaN
23      NaN       NaN     NaN          NaN      NaN       NaN     NaN          0.0
24    313.0       NaN     NaN          NaN      NaN       NaN     NaN          NaN
25      NaN   2141.80     NaN          NaN      NaN       NaN     NaN          NaN
26      NaN       NaN     3.0          NaN      NaN       NaN     NaN          NaN
27      NaN       NaN     NaN          0.0      NaN       NaN     NaN          NaN
28      NaN       NaN     NaN          NaN    239.0       NaN     NaN          NaN
29      NaN       NaN     NaN          NaN      NaN   2142.80     NaN          NaN
30      NaN       NaN     NaN          NaN      NaN       NaN     1.0          NaN
31      NaN       NaN     NaN          NaN      NaN       NaN     NaN          0.0
32     47.0       NaN     NaN          NaN      NaN       NaN     NaN          NaN
33      NaN   2141.75     NaN          NaN      NaN       NaN     NaN          NaN
34      NaN       NaN     1.0          NaN      NaN       NaN     NaN          NaN
35      NaN       NaN     NaN          0.0      NaN       NaN     NaN          NaN
36      NaN       NaN     NaN          NaN    860.0       NaN     NaN          NaN
37      NaN       NaN     NaN          NaN      NaN   2142.90     NaN          NaN
38      NaN       NaN     NaN          NaN      NaN       NaN     5.0          NaN
39      NaN       NaN     NaN          NaN      NaN       NaN     NaN          0.0

I want it to be concise in 5 rows and not 40 rows.

The sample data inside dictionary which I am using looks like:

"Bids":[{"Size":21,"Price":1999.15,"TotalOrders":2,"BuyBackMarketMaker":0},
{"Size":20,"Price":1999.1,"TotalOrders":1,"BuyBackMarketMaker":0},
{"Size":40,"Price":1999.05,"TotalOrders":1,"BuyBackMarketMaker":0},
{"Size":185,"Price":1999,"TotalOrders":6,"BuyBackMarketMaker":0},
{"Size":7,"Price":1998.8,"TotalOrders":2,"BuyBackMarketMaker":0}],
"Asks":[{"Size":1,"Price":1999.8,"TotalOrders":1,"BuyBackMarketMaker":0},
{"Size":3,"Price":1999.85,"TotalOrders":1,"BuyBackMarketMaker":0},
{"Size":34,"Price":1999.9,"TotalOrders":2,"BuyBackMarketMaker":0},
{"Size":199,"Price":2000,"TotalOrders":10,"BuyBackMarketMaker":0},
{"Size":1,"Price":2000.05,"TotalOrders":1,"BuyBackMarketMaker":0}]

pls suggest an optimized code for the same.

1 Answers

Use concat with DataFrame constructor, for new columns names use rename:

rename = {'TotalOrders':'_to','BuyBackMarketMaker':'_buyback'}
df = pd.concat([pd.DataFrame(d['Bids']).rename(columns=rename).add_prefix('bid'), 
                pd.DataFrame(d['Asks']).rename(columns=rename).add_prefix('ask')], axis=1)

print (df)
   bidSize  bidPrice  bid_to  bid_buyback  askSize  askPrice  ask_to  \
0       21   1999.15       2            0        1   1999.80       1   
1       20   1999.10       1            0        3   1999.85       1   
2       40   1999.05       1            0       34   1999.90       2   
3      185   1999.00       6            0      199   2000.00      10   
4        7   1998.80       2            0        1   2000.05       1   

   ask_buyback  
0            0  
1            0  
2            0  
3            0  
4            0  
Related