繁体   English   中英

使用 pandas json_normalize 将 json 转换为 dataframe,但有些列仍有我需要转换的列表

[英]Using pandas json_normalize to convert json into a dataframe, but some columns still have a list that I need to convert

I can successfully use pandas.io.json.json_normalize to convert my json object into the desired dataframe format. 但是,似乎 dataframe 中的某些列未转换为所需的格式,而是在单元格值中保留为列表。

from pandas.io.json import json_normalize
df = json_normalize(res['transactions'])

这会给我这些 df.columns

Index(['tradeID', 'tradeOpened.guaranteedExecutionFee',
       'tradeOpened.halfSpreadCost', 'tradeOpened.initialMarginRequired',
       'tradeOpened.price', 'tradeOpened.tradeID', 'tradeOpened.units',
       'tradesClosed'], dtype='object')

请注意,“tradeOpened.price”和“tradeOpened.tradeID”等列是所需的目标 output,这些似乎可以正常工作。 问题出在“tradesClosed”列 - 我仍然得到一个包含单元格值的列,其中包含一个列表,如下所示:

[{'tradeID': '2239', 'units': '-2838', 'realiz...

我希望将其分解为像 tradeOpened 那样的列。 所以我应该有像'tradeClosed.tradeID'和'tradeClosed.units'这样的列。

似乎需要一个多步转换过程,但我不确定 go 最有效的方法。

任何帮助表示赞赏。

不确定是否有 pandas/json package 有效方式,但我编写了一个迭代器来更新现有列。 (在创建初始 dataframe 时,一些列已经存在于正确的 json 转换中 - 但另一个不正确的列包含需要添加到这些现有列的数据)

for idx in adf.index:

    tradeOpenedRow = adf['tradeOpened'][idx]

    if type(tradeOpenedRow) == dict:

        if type(adf.loc[idx,'tradeOpened.price']) == float:
            adf.loc[idx,'tradeOpened.price'] = tradeOpenedRow['price']

        if type(adf.loc[idx,'tradeOpened.tradeID']) == float: 
            adf.loc[idx,'tradeOpened.tradeID'] = tradeOpenedRow['tradeID']

        if type(adf.loc[idx,'tradeOpened.units']) == float:     
            adf.loc[idx,'tradeOpened.units'] = tradeOpenedRow['units']

        if type(adf.loc[idx,'tradeOpened.guaranteedExecutionFee']) == float:     
            adf.loc[idx,'tradeOpened.guaranteedExecutionFee'] = tradeOpenedRow['guaranteedExecutionFee']

        if type(adf.loc[idx,'tradeOpened.halfSpreadCost']) == float:     
            adf.loc[idx,'tradeOpened.halfSpreadCost'] = tradeOpenedRow['halfSpreadCost']

        if type(adf.loc[idx,'tradeOpened.initialMarginRequired']) == float:     
            adf.loc[idx,'tradeOpened.initialMarginRequired'] = tradeOpenedRow['initialMarginRequired']
            print('index ', idx, ' values set')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM