Python - преобразованный вложенный JSON с вложенными столбцами - PullRequest
0 голосов
/ 09 июля 2020

Я новичок в структурах данных Python и JSON и искал некоторую помощь

Мне удалось создать код Python, который вызывает веб-API и преобразует возвращаемый JSON данные (report_rows) в фрейм данных успешно с использованием json_normalize ()

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

  1. Получить имена столбцов из JSON данных - В кадре данных я хотел бы преобразовать имена столбцов: c1, c2, c3, et c в RECORD_NO, REF_RECORD_NO, SOV_LINEITEM_NO. Имена столбцов находятся в JSON data [data] [report_header] [cXX] [name], где cXX - номер столбца
  2. Сортировать имена столбцов - Я хотел бы заказать столбцы фрейма данных, поэтому вместо c1, c10, c11, c12, c2, c3, et c это c1, c2, c3 ... c10, c11, c12

Если кто-то может предоставьте некоторую помощь, мы будем очень признательны

Заранее спасибо

Python Код

json_data = json.loads(res.read())
data = pd.json_normalize(json_data['data'], record_path=['report_row'])
print(data)

, который выводит следующее

            c1 c10            c11  ...               c7            c8        c9
0  CON-0000001  71    VEN-0000001  ...  Build IT System  Contract 123   Pending
1  CON-0000002  72    VEN-0000002  ...  Build IT System  Contract XYZ  Approved

JSON Данные

  "data": [
    {
      "report_header": {
        "c11": {
          "name": "VENDOR_RECORD",
          "type": "java.lang.String"
        },
        "c10": {
          "name": "VENDOR_ID",
          "type": "java.lang.Integer"
        },
        "c12": {
          "name": "VENDOR_NAME",
          "type": "java.lang.String"
        },
        "c1": {
          "name": "RECORD_NO",
          "type": "java.lang.String"
        },
        "c2": {
          "name": "REF_RECORD_NO",
          "type": "java.lang.String"
        },
        "c3": {
          "name": "SOV_LINEITEM_NO",
          "type": "java.lang.String"
        },
        "c4": {
          "name": "REF_ITEM",
          "type": "java.lang.String"
        },
        "c5": {
          "name": "PROJECTNUMBER",
          "type": "java.lang.String"
        },
        "c6": {
          "name": "PROJECTNAME",
          "type": "java.lang.String"
        },
        "c7": {
          "name": "TITLE",
          "type": "java.lang.String"
        },
        "c8": {
          "name": "CONTRACT_NO",
          "type": "java.lang.String"
        },
        "c9": {
          "name": "STATUS",
          "type": "java.lang.String"
        }
      },
      "report_row": [
        {
          "c1": "CON-0000001",
          "c10": "71  ",
          "c11": "VEN-0000001",
          "c12": "Microsoft",
          "c2": "",
          "c3": "1",
          "c4": "",
          "c5": "P-0037",
          "c6": "Project ABC",
          "c7": "Build IT System",
          "c8": "Contract 123",
          "c9": "Pending"
        },
        {
          "c1": "CON-0000002",
          "c10": "72  ",
          "c11": "VEN-0000002",
          "c12": "Google",
          "c2": "",
          "c3": "1.1",
          "c4": "",
          "c5": "P-0037",
          "c6": "Project ABC",
          "c7": "Build IT System",
          "c8": "Contract XYZ",
          "c9": "Approved"
        }
      ]
    }
  ],
  "message": [
    "OK"
  ],
  "status": 200
}

1 Ответ

0 голосов
/ 14 июля 2020

Мне удалось решить проблему, добавив следующий код ...

# Get the number of fields/columns in the JSON data
number_of_fields = len((json_data['data'][0]['report_header']))
reorder_columns = []
new_column_names = []
field_index = 0

# Loop through the Columns and do the following...
# reorder_columns - this is the column order that i want: c1, c2, c3 ... c10, c11, c12
# new_column_name - this will retrieve the column names from the header: c1.name, c2.name, etc
while field_index < number_of_fields:
    field_index += 1
    new_column = "c" + str(field_index)
    reorder_columns.append(new_column) 
    column_header = new_column + '.name'
    new_column_name = header.iloc[0][new_column + '.name']
    new_column_names.append(new_column_name)

data = pd.json_normalize(json_data['data'], record_path=['report_row'])
data = data.reindex(columns=reorder_columns)
data.columns = new_column_names
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...