От «вложенного» DataFrame к вложенному Json

У меня есть DataFrame, который содержит псевдовложенные столбцы (т. е. как имя), созданные с использованием функции Panda 'json_normalize' во вложенном JSON. Я хотел бы создать JSON из DataFrame с вложенными значениями.

Вот пример того, что я пытаюсь сделать. Обратите внимание, что это просто пример, чтобы сделать его более понятным, это не совсем мой вариант использования. Мой вариант использования требует, чтобы Pandas выполнял некоторые «тяжелые» преобразования Dataframe.

DataFrame как:

   id name.first name.last
0   1     Coleen      Volk
1   2       Mose    Regner

Я хочу JSON:

[{'id': 1,
 'name': {'first': 'Coleen',
         'last': 'Volk'}},
{'id': 2, 
'name': {'first': 'Mose', 
         'last': 'Regner'}}]

-- Простой код для репликации:

data = [{'id': 1, 'name': {'first': 'Coleen', 'last': 'Volk', 'nickname': 'Perico'}},
    {'id': 2, 'name': {'first': 'Mose', 'last': 'Regner', 'nickname': 'Palotes'}}]

df = pd.io.json.json_normalize(data)
#some transormations using Pandas
df = df.drop(columns=['name.nickname'])

#Now I want to build the JSON

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

gold_cy 29.03.2019 12:46

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

Iñigo 29.03.2019 12:58

вы не можете удалить псевдоним, прежде чем помещать его в фрейм данных, тогда

gold_cy 29.03.2019 13:07

Я мог бы, но, как я уже сказал, это фиктивный пример того, что я пытаюсь сделать. Мои фактические данные не такие, это не имена. Мне нужны Pandas для нормализации значений, преобразования в разные типы,... Удаление столбца — это просто пример преобразования

Iñigo 29.03.2019 13:09
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
351
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно функция, представленная здесь @Parsa T

import pandas as pd

data = [{'id': 1, 'name': {'first': 'Coleen', 'last': 'Volk', 'nickname': 'Perico'}},
    {'id': 2, 'name': {'first': 'Mose', 'last': 'Regner', 'nickname': 'Palotes'}}]

df = pd.io.json.json_normalize(data)
#some transormations using Pandas
df = df.drop(columns=['name.nickname'])





def set_for_keys(my_dict, key_arr, val):
    """
    Set val at path in my_dict defined by the string (or serializable object) array key_arr
    """
    current = my_dict
    for i in range(len(key_arr)):
        key = key_arr[i]
        if key not in current:
            if i==len(key_arr)-1:
                current[key] = val
            else:
                current[key] = {}
        else:
            if type(current[key]) is not dict:
                print("Given dictionary is not compatible with key structure requested")
                raise ValueError("Dictionary key already occupied")

        current = current[key]

    return my_dict

def to_formatted_json(df, sep = "."):
    result = []
    for _, row in df.iterrows():
        parsed_row = {}
        for idx, val in row.iteritems():
            keys = idx.split(sep)
            parsed_row = set_for_keys(parsed_row, keys, val)

        result.append(parsed_row)
    return result


#Where df was parsed from json-dict using json_normalize
to_formatted_json(df, sep = ".")

Выход:

Out[9]: 
[{'id': 1, 'name': {'first': 'Coleen', 'last': 'Volk'}},
 {'id': 2, 'name': {'first': 'Mose', 'last': 'Regner'}}]

Спасибо! Я ожидал чего-то реализованного в Пандах, но иногда это невозможно получить. Я некоторое время искал, чтобы проверить, был ли предыдущий вопрос, но ничего не нашел. Об использовании обратного в качестве ключевого слова было нелегко думать.

Iñigo 29.03.2019 16:25

Другие вопросы по теме