WedX - журнал о программировании и компьютерных науках

Избегайте двойного кодирования JSON при объединении двух вызовов to_json от Pandas

У меня есть два кадра данных (узлы и ссылки), которые JSONified вызовом to_json Pandas:

links = links.to_json(orient='records')
nodes = nodes.to_json(orient='records')

Результат этих вызовов выглядит так, как ожидалось:

Ссылки:

[{"source":"Michael Scott", "target":"Jim Halpert", "value":1}]

Узлы:

[{"id":"Michael Scott"}, {"id":Jim Halpert"}]

Затем я объединяю эти JSON-слова в один объект (для использования в принудительном графе d3):

j = {"nodes":nodes, "links":links}

Теперь у меня две проблемы:

  1. Объект JSON j имеет двойное кодирование с одинарными кавычками вокруг квадратных скобок.

{'nodes': '[{"id":"Michael Scott"}, {"id":Jim Halpert"}]', 'links': '[{"source":"Michael Scott", "target":"Jim Halpert", "value":1}]' }

  1. Кажется, нет отличного способа записать это в файл. Я не могу использовать встроенный путь для to_json, потому что мне нужно разделить кадры данных, которые уже были JSONified. Я пробовал это:

    jsonOut = open('test.json', 'w') jsonOut.write(json.dumps(j))

Это также приводит к двойному кодированию в финальном файле, только с дополнительными двойными кавычками вместо одинарных.

Вопрос. Как избежать двойного кодирования результирующих файлов JSON при объединении двух фреймов данных Pandas, которые были преобразованы в JSON? И как мне записать полученный файл?

Спасибо за любое понимание, которое у вас может быть!


Ответы:


1

Метод Pandas to_json() преобразует в JSON строка, представляющая собой значение, добавляемое к вашему внешнему словарю j.

Итак, этот код сериализует DatFrame как string:

links = links.to_json(orient='records')

Если вы проверите тип links, это будет str:

type(links)
<type 'str'>

Вместо этого попробуйте использовать to_dict().

12.06.2017
  • Это устраняет проблему двойного кодирования! Большое спасибо - извините за такой простой ответ. У вас есть идея по поводу второй части моего вопроса, касающейся того, как это написать? 12.06.2017
  • Ваш текущий метод использования json.dumps() выглядит нормально; какая проблема у тебя с ним? 12.06.2017
  • Вы правы - я потерял связь с БД, из которой извлекаю данные, и сделал неверное предположение. В очередной раз благодарим за помощь! 12.06.2017

  • 2

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

    import json
    links = [{"source":"Michael Scott", "target":"Jim Halpert", "value":1}]
    nodes = [{"id":"Michael Scott"}, {"id":"Jim Halpert"}]
    j = {"nodes":nodes, "links":links}
    print j
    

    мой вывод:

    {'nodes': [{'id': 'Michael Scott'}, {'id': 'Jim Halpert'}], 'links': [{'source': 'Michael Scott', 'target': 'Jim Halpert', 'value': 1}]}
    

    Я также создал файл json: введите здесь описание изображения

    У вас могут возникнуть проблемы с тем, как вы создаете ссылки и узлы перед pd.to_json().

    Жюльен

    12.06.2017
  • Первоначальное кодирование в str происходит до создания j, фактически во время создания links и nodes. Вы не воспроизводите проблему здесь, поскольку начинаете с (свернутого вручную) и правильного определения входных словарей. 12.06.2017
  • Правильно, вот почему я не думал, что включение дополнительного кода будет полезно, поскольку для меня отправной точкой являются словари, похожие на ваши, Жюльен. И все же они созданы to_json, а не ручной работы. 12.06.2017
  • Как сказал FujiApple, to_json создает не Dict, а строки. Вы должны использовать to_dict для экспорта или json.loads для преобразования вашей строки в dict: j = {nodes: json.loads(nodes), links:json.loads(links)} 12.06.2017
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]