Экспорт Dict в JSON или Dataframe в JSON не дает квадратных скобок

#python #pandas #dictionary

#питон #панды #словарь

Вопрос:

Преобразование фрейма данных в JSON или из словаря в JSON по какой-то причине не привело к успеху, независимо от того, какой параметр orient использовался (таблица или разделение, индекс или записи).

код:

 dataf = pd.DataFrame(columns = ["Objects", "Col1", "Col2"])   
dataf['Objects'] = ['Object1','Object2']
dataf['Col1']= ["1","2"]
dataf['Col2']= ["3","4"]

dataf.set_index('Objects', inplace = True)    

# dataf converted to dict 
dataf = dataf.to_dict(orient='index')
 

Мой вывод:

 dataf
Out[199]: {'Object1': {'Col1': '1', 'Col2': '3'}, 'Object2': {'Col1': '2', 'Col2': '4'}}
 

Где ‘Object1’ и ‘Object2’ являются ключами, а соответствующие им значения {‘Col1’: ‘1’, ‘Col2’: ‘3’}, где Col1 — это ключ, ‘1’ — значение, а Col2 — ключ, 3 — значение

outp1 = json.dumps(данные)

 outp1
Out[225]: '{"Object1": {"Col1": "1", "Col2": "3"}, "Object2": {"Col1": "2", "Col2": "4"}}'

 

Желаемый результат (отредактированный):

 {
  "Object1": [{
        "Col1": "1",
        "Col2": "3"
      },
  {
  "Object2": [{
        "Col1": "2",
        "Col2": "4"
      }],
  }]
}
 

Если я не ввел синтаксис правильного JSON, вот ссылка на картинку: ссылка
Это формат, который я хочу получить при преобразовании его в JSON.

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

1. Чтобы было ясно, вы говорите, что в качестве значения для Object1 вам нужен список, содержащий словарь с Col1 и Col2 , а также Object3 и его столбцы?

2. Откуда берется объект 3?

3. Я бы сказал, что это называется вложенным словарем, где Object1 и Object2 являются основными ключами, в которых есть «столбцы», и эти столбцы содержат информацию или их значения. Вывод описывает это, я полагаю?

4. «Ожидаемый / желаемый результат и добавлен дополнительный пример (псевдо): » это означает, что я просто продолжил пример того, как должен выглядеть результат. с приведенным выше кодом и фреймом данных только первый блок должен быть выведен именно таким образом, без дальнейшего примера Object3 и т. Д

5. Я все еще не совсем уверен, какова ваша цель, но позвольте мне привести вам пример. Допустим, вы хотите найти значение для Col2 of Object2 . С тем, как это сделали Pandas, вам просто нужно было бы сделать output["Object2"]["Col2"] . С тем, как вы пытаетесь это сделать, вам нужно будет сделать output["Object1"][1]["Object2"][0]["Col2"] . Как вы думаете, какой из них вам нужен?

Ответ №1:

Я рассмотрю несколько способов форматирования ваших данных и насколько они будут полезны.

  1. То, что вы изначально просили в своем вопросе:
 {
  "Object1": [{
        "Col1": "1",
        "Col2": "3"
      },
  {
  "Object2": [{
        "Col1": "2",
        "Col2": "4"
      }],
  }]
}
 

Это на 100% неверно по причинам, которые я уже изложил в комментарии. Чтобы получить доступ Col2 к of Object2 , вам нужно будет сделать output["Object1"][1]["Object2"][0]["Col2"] . Это не имеет абсолютно никакого смысла.

2.

 {
  "Object1": [{
        "Col1": "1",
        "Col2": "3"
      }],
  {
  "Object2": [{
        "Col1": "2",
        "Col2": "4"
      }],
  }
}
 

Это немного лучше, но все равно не очень полезно. Теперь, чтобы получить доступ Col2 к of Object2 , вам нужно будет сделать output["Object2"][0]["Col2"] . Какая польза от этого дополнительного [0] в середине? Нет.

  1. Что вам дали Pandas
 {
    'Object1': {
        'Col1': '1',
        'Col2': '3'
    },
    'Object2': {
        'Col1': '2',
        'Col2': '4'
    }
}
 

Это полезно. Теперь, чтобы получить доступ Col2 к of Object2 , вам просто нужно сделать output["Object2"]["Col2"] . Это вполне приемлемый способ организации данных.

  1. О чем, я думаю, вы просите
 {
    'Objects': [
        {
            'name': 'Object1'
            'Col1': '1',
            'Col2': '3'
        },
        {
            'name' : 'Object2'
            'Col1': '2',
            'Col2': '4'
        }
    ]
}
 

Судя по ссылке, которую вы указали в комментариях, похоже, что это ваша цель. Объекты хранятся в виде списка, и каждый список содержит набор пар ключ / значение. Обратите внимание, что я преобразовал ObjectN ключ в значение. Это связано с тем, что в списках нет пар ключ / значение.

  1. Более простая версия 4
 [
    {
        'name': 'Object1'
        'Col1': '1',
        'Col2': '3'
    },
    {
        'name' : 'Object2'
        'Col1': '2',
        'Col2': '4'
    }
]
 

Это так же полезно, как 4, но проще в использовании. Вместо output['Objects'][1]['Col2'] этого вам сейчас просто нужно output[1]['Col2'] .

Итак, какой из них вы должны использовать?

Это зависит от того, что вы хотите сделать со своими данными. Если вы хотите иметь возможность легко перебирать объекты, то вам нужно 4/5. Это потому, что они полагаются на списки, а итерация — это именно то, для чего хороши списки. С другой стороны, если вы в основном хотите найти информацию для одного объекта, не беспокоясь о других объектах, тогда вам нужно 3. Словари созданы для перехода к определенным значениям.

Если вы хотите узнать, как преобразовать из 3 в 4 или 5, я рекомендую задать другой вопрос или попробовать сделать это самостоятельно. Это совсем не сложно!