【问题标题】:Pandas dataframe to a dynamic nested JSON将 Pandas 数据框转换为动态嵌套 JSON
【发布时间】:2019-05-12 20:32:25
【问题描述】:

我想创建如下所示的数据框:

    employeeId  firstName   lastName    emailAddress    isDependent employeeIdTypeCode  entityCode  sourceCode  roleCode
0   E123456 Andrew  Hoover  hoovera@xyz.com False   001 AE  AHR EMPLR
0   102939485   Andrew  Hoover  hoovera@xyz.com False   002 AE  AHR EMPLR
2   E123458 Celeste Riddick riddickc@xyz.com    True    001 AE  AHR EMPLR
2   354852739   Celeste Riddick riddickc@xyz.com    True    002 AE  AHR EMPLR
1   E123457 Curt    Austin  austinc1@xyz.com    True    001 AE  AHR EMPLR
1   675849302   Curt    Austin  austinc1@xyz.com    True    002 AE  AHR EMPLR
3   E123459 Hazel   Tooley  tooleyh@xyz.com False   001 AE  AHR EMPLR
3   937463528   Hazel   Tooley  tooleyh@xyz.com False   002 AE  AHR EMPLR

对于每一行,我想将其转换为嵌套的 JSON 格式。 所以我希望我的 JSON 对于每个人来说都是这样的,因为我想遍历数据框并将其发布到 api。

{  
   "individualInfo":  
      {  
         "individualIdentifier":[  
            {  
               "identityTypeCode":"001",
               "identifierValue":"E123456",
               "profileInfo":{  
                  "firstName":"Andrew",
                  "lastName":"Hoover",
                  "emailAddress":"hoovera@xyz.com"
               }
            },
            {  
               "identityTypeCode":"002",
               "identifierValue":"102939485",
               "profileInfo":{  
                   "firstName":"Andrew",
                  "lastName":"Hoover",
                  "emailAddress":"hoovera@xyz.com"
               }
            }
         ],
         "entityCode":"AE",
         "sourceCode":"AHR",
         "roleCode":"EMPLR"
         "isDependent":False
      }
} 

这里重要的是,我希望生成的 JSON 与数据帧上的 Id 列无关。因此,例如,如果数据帧上有另一个 ID,那么我希望该 ID 具有另一个具有相同配置文件信息的字典对象。所以每个配置文件都可以有任意数量的Id

我能做的代码:

j = (result.groupby(['identifierValue','identityTypeCode'], as_index=False).apply(lambda x: x[['firstName','lastName','emailAddress']].to_dict('r')).reset_index().rename(columns={0:'ProfileInfo'}).to_json(orient='records'))

是否有可能在 pandas 中动态实现这样的目标? 非常感谢您的帮助!

我能找到的其他几个嵌套问题:

Convert Pandas Dataframe to nested JSON

pandas groupby to nested json

这些问题都没有帮助我,因为我希望将我的数据帧的每个索引都转换为单独的 JSON 有效负载,因为每个人都将使用我为将数据发布到数据库而拥有的 api 服务。

【问题讨论】:

  • 假设你看到了这个? stackoverflow.com/questions/40470954/…
  • 是的,我确实检查过它并且也使用了该代码。但是我的石斑鱼数据不是一维的。此外,如果(identifierValue, identityTypeCode) 的数量发生变化,json 可能会发生变化。所以我希望它是动态的!
  • 很遗憾,没有 - 我认为一个(我)可以编写一些可爱的递归函数来做到这一点,但 read_jsonto_json 在我自己的应用程序中并没有按照我需要的方式工作。在此过程中,有很多设计选择可供选择,而树中的每个分支都需要一段时间来探索。
  • 我将我的数据框更新为更好的 group by 子句,但我仍然坚持我应该做的事情。有人可以帮我解决吗?
  • 我可以再试一次;同时,也许可以通过大量指向其他 JSON 帖子的链接重新发布您的问题,并解释为什么您的问题不同?

标签: python json pandas


【解决方案1】:

听起来最明智的方法是:

info_dict = df.set_index(['identifierValue', 'identifierValue']).to_dict('index')

然后,每次您在 JSON 中到达 profileInfo 时,您都可以使用适当的 ('identifierValue', 'identifierValue')` 密钥对引用上面的 info_dict

我对您想要的格式感到困惑,但这是一个开始。

【讨论】:

  • 我也尝试过这种方式,但我无法将其分组,因为我的数据没有一维格式。
【解决方案2】:

不是真正的 Pandas 解决方案,但种类可以:

从您的 result 数据框开始

from collections import defaultdict
import json

result = 'your data frame'

dicted = defaultdict(dict)
for r in result.values.tolist():
    identifierValue, firstName, lastName, emailAddress,isDependent,\
    identityTypeCode, entityCode, sourceCode,roleCode = r
    tupled_criteria = (firstName,lastName,emailAddress)
    if dicted[tupled_criteria].get("individualInfo"):
        pass
    else:
        dicted[tupled_criteria]["individualInfo"] = {}

    dicted[tupled_criteria]["individualInfo"]['entityCode'] = entityCode
    dicted[tupled_criteria]["individualInfo"]['soruceCode'] = sourceCode
    dicted[tupled_criteria]["individualInfo"]['roleCode'] = roleCode
    dicted[tupled_criteria]["individualInfo"]['isDependent'] = isDependent
    if dicted[tupled_criteria]["individualInfo"].get("individualIdentifier"):
        pass
    else:
        dicted[tupled_criteria]["individualInfo"]["individualIdentifier"] = []
    dicted[tupled_criteria]["individualInfo"]["individualIdentifier"]\
        .append({"identityTypeCode":identityTypeCode,
                   "identifierValue":identifierValue,
                    "profileInfo":{  
                      "firstName":firstName,
                      "lastName":lastName,
                      "emailAddress":emailAddress}})

for k,v in dicted.items():
    print(k,'\n',json.dumps(v),'\n\n')

【讨论】:

    【解决方案3】:

    也许您可以遍历一个组,然后对该组中的每一行进行另一次迭代。因此,创建嵌套字典结构:

    这解释了一种处理方式:

    import pandas as pd
    df = pd.DataFrame({"entityCode":[1,1,3,3],"sourceCode":[4,4,6,6],'identityTypeCode':[7,8,9,10]})
    results = []
    for i, sub_df in df.groupby(["entityCode","sourceCode"]):
        entityCode, sourceCode = i
        d = {}
        d["individualInfo"] = {"entityCode":entityCode, "sourceCode":sourceCode}
        sub_result = []
        for _, row in sub_df[["identityTypeCode"]].drop_duplicates().iterrows():
            sub_result.append(row.to_dict())
        d["individualIdentifier"] = sub_result
        results.append(d)
    results
    

    返回如下内容:

    [{'individualInfo': {'entityCode': 1, 'sourceCode': 4},
      'individualIdentifier': [{'identityTypeCode': 7}, {'identityTypeCode': 8}]},
     {'individualInfo': {'entityCode': 3, 'sourceCode': 6},
      'individualIdentifier': [{'identityTypeCode': 9}, {'identityTypeCode': 10}]}]
    

    之后,您可以将字典转换为 json。

    【讨论】:

      猜你喜欢
      • 2017-03-21
      • 2020-12-16
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 2022-01-21
      • 2020-11-12
      • 2021-12-01
      相关资源
      最近更新 更多