簡體   English   中英

如何將嵌套的 json 對象導入 pandas 數據框?

[英]How can I import a nested json object into a pandas dataframe?

我有一個像這樣的 json 對象:

[{'currency_pair': 'UOS_USDT',
  'orders': [{'account': 'spot',
              'amount': '1282.84',
              'create_time': '1655394430',
              'create_time_ms': 1655394430129,
              'currency_pair': 'UOS_USDT',
              'fee': '0',
              'fee_currency': 'UOS',
              'fill_price': '0',
              'filled_total': '0',
              'gt_discount': False,
              'gt_fee': '0',
              'iceberg': '0',
              'id': '169208865523',
              'left': '1282.84',
              'point_fee': '0',
              'price': '0.1949',
              'rebated_fee': '0',
              'rebated_fee_currency': 'USDT',
              'side': 'buy',
              'status': 'open',
              'text': 'apiv4',
              'time_in_force': 'gtc',
              'type': 'limit',
              'update_time': '1655394430',
              'update_time_ms': 1655394430129}],
  'total': 1},
 {'currency_pair': 'RMRK_USDT',
  'orders': [{'account': 'spot',
              'amount': '79.365',
              'create_time': '1655394431',
              'create_time_ms': 1655394431249,
              'currency_pair': 'RMRK_USDT',
              'fee': '0',
              'fee_currency': 'RMRK',
              'fill_price': '0',
              'filled_total': '0',
              'gt_discount': False,
              'gt_fee': '0',
              'iceberg': '0',
              'id': '169208877018',
              'left': '79.365',
              'point_fee': '0',
              'price': '2.52',
              'rebated_fee': '0',
              'rebated_fee_currency': 'USDT',
              'side': 'buy',
              'status': 'open',
              'text': 'apiv4',
              'time_in_force': 'gtc',
              'type': 'limit',
              'update_time': '1655394431',
              'update_time_ms': 1655394431249}],
  'total': 1}]

我想將其轉換為數據框。

數據來自對加密交換的 api 調用。 我使用 .json() 方法將其轉換為 json。 所以它是正確的json。 我努力了:

df = pd.DataFrame(data)
df = pd.DataFrame(data["orders")
df = pd.DataFrame(data["currency_pair"]["orders"])

以及所有其他可以想象的路徑。

我想要一個 df 列 ["currency_pair", "amount", "create_time", "price", "side"]

我有時會收到錯誤 TypeError: list indices must be integers or slices, not str or the df works but the orders object is not unpacked. 感謝所有幫助。 謝謝你。

import pandas as pd

data = [{'currency_pair': 'UOS_USDT',
  'orders': [{'account': 'spot',
              'amount': '1282.84',
              'create_time': '1655394430',
              'create_time_ms': 1655394430129,
              'currency_pair': 'UOS_USDT',
              'fee': '0',
              'fee_currency': 'UOS',
              'fill_price': '0',
              'filled_total': '0',
              'gt_discount': False,
              'gt_fee': '0',
              'iceberg': '0',
              'id': '169208865523',
              'left': '1282.84',
              'point_fee': '0',
              'price': '0.1949',
              'rebated_fee': '0',
              'rebated_fee_currency': 'USDT',
              'side': 'buy',
              'status': 'open',
              'text': 'apiv4',
              'time_in_force': 'gtc',
              'type': 'limit',
              'update_time': '1655394430',
              'update_time_ms': 1655394430129}],
  'total': 1},
 {'currency_pair': 'RMRK_USDT',
  'orders': [{'account': 'spot',
              'amount': '79.365',
              'create_time': '1655394431',
              'create_time_ms': 1655394431249,
              'currency_pair': 'RMRK_USDT',
              'fee': '0',
              'fee_currency': 'RMRK',
              'fill_price': '0',
              'filled_total': '0',
              'gt_discount': False,
              'gt_fee': '0',
              'iceberg': '0',
              'id': '169208877018',
              'left': '79.365',
              'point_fee': '0',
              'price': '2.52',
              'rebated_fee': '0',
              'rebated_fee_currency': 'USDT',
              'side': 'buy',
              'status': 'open',
              'text': 'apiv4',
              'time_in_force': 'gtc',
              'type': 'limit',
              'update_time': '1655394431',
              'update_time_ms': 1655394431249}],
  'total': 1}]

df = pd.json_normalize(data, record_path=['orders'])

並保留您需要的列。

它只有一行,它應該涵蓋您的情況,因為您想要的 'currency_pair' 已經在 'orders' 字典中,並且根據我從您的數據中了解到的情況,它始終與 'orders. 正如您所說,您也不需要“總計”。

利用:

df = pd.json_normalize(data, record_path=['orders'], meta=['currency_pair', 'total'], record_prefix='orders_')

如果你想要它們

import pandas as pd

data = [{'currency_pair': 'UOS_USDT',
  'orders': [{'account': 'spot',
              'amount': '1282.84',
              'create_time': '1655394430',
              'create_time_ms': 1655394430129,
              'currency_pair': 'UOS_USDT',
              'fee': '0',
              'fee_currency': 'UOS',
              'fill_price': '0',
              'filled_total': '0',
              'gt_discount': False,
              'gt_fee': '0',
              'iceberg': '0',
              'id': '169208865523',
              'left': '1282.84',
              'point_fee': '0',
              'price': '0.1949',
              'rebated_fee': '0',
              'rebated_fee_currency': 'USDT',
              'side': 'buy',
              'status': 'open',
              'text': 'apiv4',
              'time_in_force': 'gtc',
              'type': 'limit',
              'update_time': '1655394430',
              'update_time_ms': 1655394430129}],
  'total': 1},
 {'currency_pair': 'RMRK_USDT',
  'orders': [{'account': 'spot',
              'amount': '79.365',
              'create_time': '1655394431',
              'create_time_ms': 1655394431249,
              'currency_pair': 'RMRK_USDT',
              'fee': '0',
              'fee_currency': 'RMRK',
              'fill_price': '0',
              'filled_total': '0',
              'gt_discount': False,
              'gt_fee': '0',
              'iceberg': '0',
              'id': '169208877018',
              'left': '79.365',
              'point_fee': '0',
              'price': '2.52',
              'rebated_fee': '0',
              'rebated_fee_currency': 'USDT',
              'side': 'buy',
              'status': 'open',
              'text': 'apiv4',
              'time_in_force': 'gtc',
              'type': 'limit',
              'update_time': '1655394431',
              'update_time_ms': 1655394431249}],
  'total': 1}]

df = pd.DataFrame(data)
df['amount'] = df.apply( lambda row: row.orders[0]['amount'] , axis=1)
df['create_time'] = df.apply( lambda row: row.orders[0]['create_time'] , axis=1)
df['price'] = df.apply( lambda row: row.orders[0]['price'] , axis=1)
df['side'] = df.apply( lambda row: row.orders[0]['side'] , axis=1)
required_df = df[['currency_pair', 'amount', 'create_time', 'price', 'side']]
required_df

結果:

currency_pair   amount  create_time     price   side
0   UOS_USDT    1282.84     1655394430  0.1949  buy
1   RMRK_USDT   79.365  1655394431  2.52    buy

你好,希望這個過程可以幫助你

#Import pandas library
import pandas as pd

#Your data 
data = [{'currency_pair': 'UOS_USDT',
         'orders': [{'account': 'spot',
                     'amount': '1282.84',
                     'create_time': '1655394430',
                     'create_time_ms': 1655394430129,
                     'currency_pair': 'UOS_USDT',
                     'fee': '0',
                     'fee_currency': 'UOS',
                     'fill_price': '0',
                     'filled_total': '0',
                     'gt_discount': False,
                     'gt_fee': '0',
                     'iceberg': '0',
                     'id': '169208865523',
                     'left': '1282.84',
                     'point_fee': '0',
                     'price': '0.1949',
                     'rebated_fee': '0',
                     'rebated_fee_currency': 'USDT',
                     'side': 'buy',
                     'status': 'open',
                     'text': 'apiv4',
                     'time_in_force': 'gtc',
                     'type': 'limit',
                     'update_time': '1655394430',
                     'update_time_ms': 1655394430129}],
         'total': 1},
        {'currency_pair': 'RMRK_USDT',
         'orders': [{'account': 'spot',
                     'amount': '79.365',
                     'create_time': '1655394431',
                     'create_time_ms': 1655394431249,
                     'currency_pair': 'RMRK_USDT',
                     'fee': '0',
                     'fee_currency': 'RMRK',
                     'fill_price': '0',
                     'filled_total': '0',
                     'gt_discount': False,
                     'gt_fee': '0',
                     'iceberg': '0',
                     'id': '169208877018',
                     'left': '79.365',
                     'point_fee': '0',
                     'price': '2.52',
                     'rebated_fee': '0',
                     'rebated_fee_currency': 'USDT',
                     'side': 'buy',
                     'status': 'open',
                     'text': 'apiv4',
                     'time_in_force': 'gtc',
                     'type': 'limit',
                     'update_time': '1655394431',
                     'update_time_ms': 1655394431249}],
         'total': 1}]


#Accessing nested values
#you cloud transform the specific column 
#into a DataFrame and access it values with indices
#then parse the value to the type you need 
#i.e
float(pd.DataFrame(data[0]['orders'])['amount'].values[0])
int(pd.DataFrame(data[0]['orders'])['create_time'].values[0])
float(pd.DataFrame(data[0]['orders'])['price'].values[0])
pd.DataFrame(data[0]['orders'])['side'].values[0]

#Create a dictionary with your chosen structure
#["currency_pair", "amount", "create_time", "price", "side"]
# then insert the corresponding columns

custom_dictionary = {
    'currency_pair': [data[0]['currency_pair'], data[1]['currency_pair']],

    'amount': [float(pd.DataFrame(data[0]['orders'])['amount'].values[0]),
               float(pd.DataFrame(data[1]['orders'])['amount'].values[0])],

    'create_time': [int(pd.DataFrame(data[0]['orders'])['create_time'].values[0]),
                    int(pd.DataFrame(data[1]['orders'])['create_time'].values[0])],

    'price': [float(pd.DataFrame(data[0]['orders'])['price'].values[0]),
              float(pd.DataFrame(data[1]['orders'])['price'].values[0])],

    'side': [pd.DataFrame(data[0]['orders'])['side'].values[0],
             pd.DataFrame(data[1]['orders'])['side'].values[0]]}

#Create a DataFrame with your custom dictionary and voila
df = pd.DataFrame(custom_dictionary)
df

數據框(df)可能如下所示:

自定義數據框

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM