Панды несколько групп JSON - PullRequest
2 голосов
/ 11 октября 2019

У меня возникли проблемы с получением следующего фрейма данных в структуру JSON. Я попробовал несколько вещей, но не могу добраться до последнего. Итак, у меня есть фрейм данных со следующим

  serialNumber |    date    | part  | value | name
 --------------|------------|-------|-------|---------------- 
  ABC0001      | 01/10/2019 | Part1 | ABC1  | ABC            
  ABC0001      | 01/10/2019 | Part1 | ABC2  | XYZ            
  ABC0001      | 02/10/2019 | Part2 | ABC3  | ASF            
  ABC0001      | 02/10/2019 | Part2 | ABC4  | TSR    

И он мне нужен в формате

  { "SerialNumber": "ABC001",
    "detail": [  { "part": "Part1",
                   "date":"01/10/2019",
                   "extras": [  { "value": "ABC1",
                                  "name": "ABC"
                                },
                                { "value": "ABC2",
                                  "name": "XYZ"
                                }]
                 },
                 { "part": "Part2",
                   "date":"02/10/2019",
                   "extras": [   { "value": "ABC3",
                                  "name": "ASF"
                                },
                                { "value": "ABC4",
                                  "name": "TSR"
                                }]
              ]
     }  

Итак, группирую серийный номер, затем данные и часть, затем значение и имя. Я посмотрел на некоторые ответы здесь и здесь , последний очень помог

df.groupby(['serialNumber', 'Part']).apply(
        lambda r: r[['Value', 'identifierName']].to_dict(orient='records')
    ).unstack('serialNumber').apply(lambda s: [
        {s.index.name: idx, 'detail=': value}
        for idx, value in s.items()]
    ).to_json(orient='records')

, что дает мне

[
   {
      "ABC0001":{
         "Part":"Part1",
         "detail=":[
            {
               "Value":"ABC1",
               "identifierName":"ABC"
            },
            {
               "Value":"ABC2",
               "identifierName":"XYZ"
            }
         ]
      }
   },
   {
      "ABC0001":{
         "Part":"Part2",
         "detail=":[
            {
               "Value":"ABC3",
               "identifierName":"ASF"
            },
            {
               "Value":"ABC4",
               "identifierName":"TSR"
            }
         ]
      }
   }
]

но ломается, когда я добавляю дату, и не показывает ярлык с серийным номером. Предложения ?? советы?

1 Ответ

0 голосов
/ 11 октября 2019

В пандах нет функции по умолчанию для решения этой проблемы.

Этот код вложения повторяет каждый уровень MultIndex, добавляя слои в словарь, пока самый глубокий слой не будет присвоен значению Series.

Это будет работать для любого числаскладки:

grouped = df.set_index(['serialNumber', 'Part'])

import json

levels = grouped.ndim
dicts = [{} for i in range(levels)]
last_index = None

for index,value in enumerate(grouped.itertuples(), 1):

    if not last_index:
        last_index = index

    for (ii,(i,j)) in enumerate(zip(index, last_index)):
        if not i == j:
            ii = levels - ii -1
            dicts[:ii] =  [{} for _ in dicts[:ii]]
            break

    for i, key in enumerate(reversed(index)):
        dicts[i][key] = value
        value = dicts[i]

    last_index = index


result = json.dumps(dicts[-1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...