Конвертировать pandas DataFrame в произвольные вложенные JSON данные - PullRequest
1 голос
/ 01 марта 2020

Предположим, что у меня есть pandas DataFrame с именем 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 слоя, как показано выше, было бы очень полезно. Заранее спасибо.

1 Ответ

2 голосов
/ 01 марта 2020

Поскольку у вас есть несколько уровней группировки, я бы рекомендовал просто использовать для l oop для перебора ваших данных.

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

print(json.dumps(make_nested(df), indent=2))
{
  "src1": {
    "table1": {
      "col1": {},
      "col2": {}
    },
    "table2": {
      "col1": {}
    }
  },
  "src2": {
    "table1": {
      "col1": {},
      "col2": {}
    }
  }
}

Предполагается, что ваши столбцы расположены слева направо: самые внешние ключи - самые внутренние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...