У меня есть строка JSON с данными вызова, и каждый вызов содержит несколько точек данных kvp. Внутри массива KVPdata будет список пар ключ-значение для каждого типа kvp. Цель здесь состоит в том, чтобы объединить этот JSON в несколько записей и вывести в виде кадра данных pandas. Мне нужны некоторые данные о том, как преобразовать эту строку в приведенный ниже табличный формат с использованием кадра данных pandas.
ввод =
[
{
'callId': 'ff0818c8',
'kvpdata': [
{
'kvptype': 'customer',
'kvpdict': {
'attribute1': 'value1',
'attribute2': 'value2',
'attribute3': 'value3',
'attribute4': 'value4'
},
'agentId': '9f1989ab-d1b6-4498-8cf7-f195918f92b4',
'commIds': [
'3af52ec2-53b0-4c4b-a833-6d09e9058d68'
]
},
{
'kvptype': 'queue',
'kvpdict': {
'attribute1': '10',
'attribute3': '[value3]'
},
'agentId': '36285ba0-a87e-4b29-afe8-4aa29189b766',
'commIds': [
'95e8cca0-401a-4b3e-9f1e-60f5934880f3'
]
}
],
'_type': 'calldata'
},
{
'callId': 'sfsdfsd23',
'kvpdata': [
{
'kvptype': 'customer',
'kvpdict': {
'attribute1': 'v1',
'attribute4': 'value4'
},
'agentId': '92323b-d1b6-4498-8cf7-f195918f92b4',
'commIds': [
'3adsds2-53b0-4c4b-a833-6d09e9058d68'
]
},
{
'kvptype': 'queue',
'kvpdict': {
'attribute1': '10',
'attribute3': '[value3]',
'attribute8': 'value8'
},
'agentId': '3dd5ba0-a87e-4b29-afe8-4aa29189b766',
'commIds': [
'95e8cca0-dfda-4b3e-9f1e-60f5934880f3'
]
},
{
'kvptype': 'agent',
'kvpdict': {
'attribute9': '80',
'attribute6': '23'},
'agentId': '56d5ba0-a87e-4b29-afe8-4aa29189b766',
'commIds': [
'00e8cca0-dfda-4b3e-9f1e-60f5934880f3'
]
}
],
'_type': 'calldata'
}
]
Я ищу приведенный ниже вывод в виде кадра данных pandas:
Я попробовал функцию json_normalize, но не получил нужных результатов.






Один из вариантов — использовать json_normalize / Melt:
out = (pd.json_normalize(obj, "kvpdata", [["callId"]], errors = "ignore")
.melt(["callId", "kvptype", "agentId", "commIds"],
value_name = "kvpdict_attribute_Value", ignore_index=False)
.assign(kvpdict_attribute= lambda x: x.pop("variable").str.split(".").str[1])
.dropna(subset = "kvpdict_attribute_Value").sort_index()
[["callId", "kvptype", "kvpdict_attribute",
"kvpdict_attribute_Value", "agentId", "commIds"]]
)
Выход :
print(out)
callId kvptype kvpdict_attribute kvpdict_attribute_Value agentId commIds
0 ff0818c8 customer attribute1 value1 9f1989ab-d1b6-4498-8cf7-f195918f92b4 [3af52ec2-53b0-4c4b-a833-6d09e9058d68]
0 ff0818c8 customer attribute2 value2 9f1989ab-d1b6-4498-8cf7-f195918f92b4 [3af52ec2-53b0-4c4b-a833-6d09e9058d68]
0 ff0818c8 customer attribute3 value3 9f1989ab-d1b6-4498-8cf7-f195918f92b4 [3af52ec2-53b0-4c4b-a833-6d09e9058d68]
0 ff0818c8 customer attribute4 value4 9f1989ab-d1b6-4498-8cf7-f195918f92b4 [3af52ec2-53b0-4c4b-a833-6d09e9058d68]
1 ff0818c8 queue attribute1 10 36285ba0-a87e-4b29-afe8-4aa29189b766 [95e8cca0-401a-4b3e-9f1e-60f5934880f3]
1 ff0818c8 queue attribute3 [value3] 36285ba0-a87e-4b29-afe8-4aa29189b766 [95e8cca0-401a-4b3e-9f1e-60f5934880f3]
2 sfsdfsd23 customer attribute1 v1 92323b-d1b6-4498-8cf7-f195918f92b4 [3adsds2-53b0-4c4b-a833-6d09e9058d68]
2 sfsdfsd23 customer attribute4 value4 92323b-d1b6-4498-8cf7-f195918f92b4 [3adsds2-53b0-4c4b-a833-6d09e9058d68]
3 sfsdfsd23 queue attribute1 10 3dd5ba0-a87e-4b29-afe8-4aa29189b766 [95e8cca0-dfda-4b3e-9f1e-60f5934880f3]
3 sfsdfsd23 queue attribute3 [value3] 3dd5ba0-a87e-4b29-afe8-4aa29189b766 [95e8cca0-dfda-4b3e-9f1e-60f5934880f3]
3 sfsdfsd23 queue attribute8 value8 3dd5ba0-a87e-4b29-afe8-4aa29189b766 [95e8cca0-dfda-4b3e-9f1e-60f5934880f3]
4 sfsdfsd23 agent attribute9 80 56d5ba0-a87e-4b29-afe8-4aa29189b766 [00e8cca0-dfda-4b3e-9f1e-60f5934880f3]
4 sfsdfsd23 agent attribute6 23 56d5ba0-a87e-4b29-afe8-4aa29189b766 [00e8cca0-dfda-4b3e-9f1e-60f5934880f3]
Извините, я не понимаю, что вы имеете в виду. О каких источниках вы говорите?
Код для панд. Обычно я думаю, что вы указываете, почему метод в той библиотеке, которую вы используете, работает для полноты проблемы OP (т.е. json_normalize/melt)... добавление базового решения (по крайней мере, для учащихся) не помогает в решении проблемы краткий обзор), он просто предлагает решение
Что ж, мои источники — документы pandas: pandas.pydata.org/pandas-docs/stable/user_guide/index.html
Честно говоря, вероятно, отличный ответ ... но, не глядя на источник, я не могу сказать, почему это работает. Почему бы не быть более кратким?