Преобразование фрейма данных Pandas в JSON со структурой и структурой массива для загрузки в BigQuery

#json #pandas #transformation

#json #pandas #преобразование

Вопрос:

Предположим, у меня есть данные из фрейма данных со столбцами id , title , и category , subcategory , и sub-subcategory это выглядит как:

 _________________________________________________________________
| id | title        | cat          |  subcat     |    subsubcat |
|____|______________|______________|_____________|______________|
| 1  | My Book      | cat1         |  subcat1    |  subsubcat1  |
| 1  | My Book      | cat2         |  subcat2    |  subsubcat2  |
| 2  | My Other Book| othercat1    | othersubcat1| othersubcat1 |
| 2  | My Other Book| othercat2    | othersubcat2|       null   |
| 2  | My Other Book| othercat3    |     null    |       null   |
|_______________________________________________________________|
  

Я хочу превратить это в (разделенный новой строкой) json, который имеет структуру, подобную:

 [
{
 'id' : '1',
 'title' : 'My Book',
 'categoryHiearchies': [
      {'categories': ['category1', 'subcategory1', 'sub-subcategory1']},
      {'categories': ['category2', 'subcategory2', 'sub-subcategory2']}

   ]
},
{
 'id' : '2',
 'title' : 'My Other Book',
 'categoryHiearchies': [
      {'categories': ['othercategory1', 'othersubcategory1', 'othersub-subcategory1']},
      {'categories': ['othercategory2', 'othersubcategory2']},
      {'categories': ['othercategory3']},
   ]
}
]
  

чтобы правильно загрузить его в BigQuery.

Есть идеи, как применить это преобразование?

Комментарии:

1. Во-первых, я думаю, что ваш вывод не является допустимым json. Во-вторых, это был ожидаемый результат, но как выглядят исходные данные, которые генерируют этот результат?

2. Я добавил, как выглядят входные данные, и думаю, что исправил структуру json. Это более понятно?

Ответ №1:

Предполагая null Nan , что значения:

 (df.set_index(['id','title'],append=True).stack()
   .groupby(level=[0,1,2]).agg(lambda x: {'categories':list(x)})
   .groupby(level=[1,2]).agg(list)
   .reset_index(name='categoryHiearchies')
   .to_json(orient='records', indent=2)   
)
  

что дает

 [
  {
    "id":1,
    "title":"My Book",
    "categoryHiearchies":[
      {
        "categories":[
          "cat1",
          "subcat1",
          "subsubcat1"
        ]
      },
      {
        "categories":[
          "cat2",
          "subcat2",
          "subsubcat2"
        ]
      }
    ]
  },
  {
    "id":2,
    "title":"My Other Book",
    "categoryHiearchies":[
      {
        "categories":[
          "othercat1",
          "othersubcat1",
          "othersubcat1"
        ]
      },
      {
        "categories":[
          "othercat2",
          "othersubcat2"
        ]
      },
      {
        "categories":[
          "othercat3"
        ]
      }
    ]
  }
]
  

Комментарии:

1. спасибо за очень хорошее решение. Вопрос: если мне нужно также создать другую структуру списка / записи внутри записи, как мне это сделать?

2. Я, честно говоря, не знаю, как на это ответить.

3. справедливо, ха-ха