У меня есть 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
Мне нужно, чтобы Панды сделали некоторые преобразования. Пример выше просто для того, чтобы сделать его максимально простым, это не мой фактический вариант использования.
вы не можете удалить псевдоним, прежде чем помещать его в фрейм данных, тогда
Я мог бы, но, как я уже сказал, это фиктивный пример того, что я пытаюсь сделать. Мои фактические данные не такие, это не имена. Мне нужны Pandas для нормализации значений, преобразования в разные типы,... Удаление столбца — это просто пример преобразования






Согласно функция, представленная здесь @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'}}]
Спасибо! Я ожидал чего-то реализованного в Пандах, но иногда это невозможно получить. Я некоторое время искал, чтобы проверить, был ли предыдущий вопрос, но ничего не нашел. Об использовании обратного в качестве ключевого слова было нелегко думать.
зачем вообще помещать его в фрейм данных для начала? вы можете просто удалить ключ, который вам не нужен, из JSON, поскольку он уже находится в нужном формате