Python 将DataFrame转换为任意嵌套的JSON数据

Python 将DataFrame转换为任意嵌套的JSON数据,python,json,pandas,dataframe,object,Python,Json,Pandas,Dataframe,Object,假设我有一个名为df的熊猫数据帧,它看起来像: source tables columns src1 table1 col1 src1 table1 col2 src1 table2 col1 src2 table1 col1 src2 table1 col2 下面我的当前代码可以遍历源列表,并将每个源中的表列表嵌套为对象: d

假设我有一个名为
df
的熊猫数据帧,它看起来像:

source      tables      columns      
src1        table1      col1       
src1        table1      col2
src1        table2      col1 
src2        table1      col1
src2        table1      col2
下面我的当前代码可以遍历源列表,并将每个源中的表列表嵌套为对象:

data = [
    {k: v} 

    for k, v in df.groupby('source')['tables'].agg(
        lambda x: {v: {} for v in x}).items()
    ]

    with open('data.json', 'w') as f:
        json.dump(data, f, indent = 2)
我收到的代码输出如下:

[
  {
    "src1": {
      "table1": {},
      "table2": {}
    }
  },
  {
    "src2": {
      "table1": {},
    }
  }
]
我的期望输出:

[
  {
    "src1": {
      "table1": {
         "col1": {},
         "col2": {}
     },
      "table2": {
         "col1": {}
     }
    }
  },
  {
    "src2": {
      "table1": {
         "col1": {}
      }
    }
  }
]

如能协助将我的2层嵌套JSON文件转换为3层,如上图所示,将不胜感激。提前谢谢。

因为这里有多个级别的分组,我建议只使用for循环来迭代数据

from collections import defaultdict  

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

    for row in df.to_numpy().tolist():
        t = data
        for r in row[:-1]:
            t = t[r]
        t[row[-1]] = {}

    return data


这假设您的列是从左到右排列的:最外面的键到最里面的键。

请欣赏。我也只需要在前3列中使用它,因为我在DataFrame中还有其他列。您能否编辑您的答案,以便仅对前3列进行分组?Thanks@weovibewvoibweoivwoiv将df[[col1,col2,col3]]传递给函数,该函数应该可以完成。发布了另一个后续问题,希望您能帮助回答,谢谢。
print(json.dumps(make_nested(df), indent=2))
{
  "src1": {
    "table1": {
      "col1": {},
      "col2": {}
    },
    "table2": {
      "col1": {}
    }
  },
  "src2": {
    "table1": {
      "col1": {},
      "col2": {}
    }
  }
}