【问题标题】:Convert pandas DataFrame to deeply nested JSON with an innermost object layer将 pandas DataFrame 转换为具有最内层对象层的深度嵌套 JSON
【发布时间】:2020-06-15 00:03:06
【问题描述】:

假设我有一个 DataFrame df,例如:

source      tables      columns   data_type   length
src1        table1      col1      INT         4
src1        table1      col2      CHAR        2
src1        table2      col1      CHAR        2
src2        table1      col1      INT         4
src2        table1      col2      DATE        3

注意:DataFrame 还有另外 4 列与问题无关

需要一个类似于以下内容的输出:

{
  "src1": {
    "table1": {
      "col1": {
        "type": "INT"
        "length": 4
      },
      "col2": {
        "type": "CHAR"
        "length": 2
      }
    },
    "table2": {
      "col1": {
        "type": "CHAR"
        "length": 2
      }
    }
  },
  "src2": {
    "table1": {
      "col1": {
        "type": "INT"
        "length": 4
      },
      "col2": {
        "type": "DATE"
        "length": 3
      }
    }
  }
}

我目前拥有的代码产生与上面相同的输出,但不包括实际数据类型值(即,我得到的是"type": "",而不是"type": ""),因为我不确定我是怎么做到的d 能够相应地嵌套值。代码如下:

def make_nested(df): 
        f = lambda: defaultdict(f)   
        data = f()  

        for row in df.to_numpy().tolist():
            t = data
            for r in row[:-6]:
                t = t[r]
            t[row[-6]] = {
                "type": '',
                "length": ''
            }

        return data

我的问题是如何在不牺牲确切格式的情况下正确地将 data_typelength 列值附加到每个 columns JSON 对象中?谢谢。

【问题讨论】:

    标签: python json pandas dataframe


    【解决方案1】:
    def make_nested(df): 
        f = lambda: defaultdict(f)   
        data = f()  
    
        for row in df.to_numpy().tolist():
            t = data
            for r in row[:-3]:
                t = t[r]
            t[row[-3]] = {
                "type": row[-2],
                "length": row[-1]
            }
    
        return data
    

    最后两列的值进入第三层,这就是你应该做的。

    【讨论】:

    • 非常感谢!我需要做的最后一件事是在第二个(表)级别中从我的 DataFrame 添加另一个列值。我怎么能做到这一点?
    • @weovibewvoibweoivwoiv 嗯,在特定级别添加第二列会破坏此代码中的所有假设。不过,这应该很容易做到。在内部循环中使用 for index, r in enumerate(row[:-3]): 然后检查条件索引 == 1 并初始化第二列的条目。
    • 发表了另一个问题 - stackoverflow.com/questions/60494426/…
    猜你喜欢
    • 2020-06-14
    • 1970-01-01
    • 2019-06-09
    • 2014-06-27
    • 1970-01-01
    • 2022-01-11
    • 2019-09-23
    • 1970-01-01
    • 2021-03-13
    相关资源
    最近更新 更多