Конвертировать pandas DataFrame в двухслойную вложенную JSON с помощью группового - PullRequest
2 голосов
/ 01 марта 2020

Предположим, что у меня есть pandas фрейм данных с именем df, похожий на:

source      tables
src1        table1       
src1        table2          
src1        table3       
src2        table1        
src2        table2 

В настоящее время я могу вывести файл JSON, который проходит через различные источники, создавая объект для каждого с кодом ниже:

all_data = [] 

    for src in df['source']:
        source_data = {
            src: {
            }
        }
        all_data.append(source_data)

    with open('data.json', 'w') as f:
        json.dump(all_data, f, indent = 2)

Это приводит к следующему выводу:

[
  {
    "src1": {}
  },
  {
    "src2": {}
  }
]

По сути, я также хочу перебрать список источников и добавить табличные объекты, соответствующие каждому источнику соответственно. Мой желаемый результат будет выглядеть примерно так:

[
  {
    "src1": {
      "table1": {},
      "table2": {},
      "table3": {}
    }
  },
  {
    "src2": {
      "table1": {},
      "table2": {}
    }
  }
]

Любая помощь в том, как я могу изменить свой код, чтобы также перебирать столбец таблиц и добавлять, что к соответствующим исходным значениям будет принята высокая оценка. Заранее спасибо.

1 Ответ

1 голос
/ 01 марта 2020

Это то, что вы ищете?

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)  

Здесь есть два уровня ответа. Чтобы сгруппировать таблицы по источнику, сначала используйте groupby с внутренним пониманием. Вы можете использовать понимание списка, чтобы собрать ваши данные в указанном формате c в целом.

[
  {
    "src1": {
      "table1": {},
      "table2": {},
      "table3": {}
    }
  },
  {
    "src2": {
      "table1": {},
      "table2": {}
    }
  }
]

Пример использования .apply с произвольными данными

df['tables2'] = 'abc'

def func(g): 
    return {x: y for x, y in zip(g['tables'], g['tables2'])}

data = [{k: v} for k, v in df.groupby('source').apply(func).items()]
data
# [{'src1': {'table1': 'abc', 'table2': 'abc', 'table3': 'abc'}},
#  {'src2': {'table1': 'abc', 'table2': 'abc'}}]

Обратите внимание, что это не будет работать с pandas 1.0 (возможно, из-за ошибки)

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