Преобразование pandas DataFrame в глубоко вложенный JSON с самым внутренним слоем объекта - PullRequest
3 голосов
/ 02 марта 2020

Предположим, у меня есть 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
      }
    }
  }
}

Код, который у меня есть в настоящее время, выдает тот же вывод, что и выше, за исключением фактических значений типа данных (ie. вместо "type": "CHAR", я получаю "type": "") поскольку я не уверен, каким образом я смогу соответственно вложить значения. Вот код:

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_type и length в каждый объект columns JSON, не жертвуя точным форматом? Благодаря.

1 Ответ

2 голосов
/ 02 марта 2020
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

Последние два значения столбца go внутри третьего уровня, так что это то, что вы должны сделать.

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