嘿,伙计们,我一直在转换一些json文本,我从一个API接收,我注意到有些人使用json_normalize,但在我的情况下,它并没有解决完整的问题,我想知道是否有人可以帮助。以pd方式导入pandas
my_json = [
{
"total": "null",
"items": [
{
"key": "time",
"label": "Time",
"value": "2022-12-13T23:59:59.939-07:00"
},
{
"key": "agentNotes",
"label": "Agent Notes",
"value": "null"
},
{
"key": "blindTransferToAgent",
"label": "Blind Transfer To Agent",
"value": "0"
}]},
{"total": "null",
"items": [
{
"key": "time",
"label": "Time",
"value": "2022-12-13T23:59:59.939-07:00"
},
{
"key": "agentNotes",
"label": "Agent Notes",
"value": "null"
},
{
"key": "blindTransferToAgent",
"label": "Blind Transfer To Agent",
"value": "0"
}
]}]
df = pd.json_normalize(my_json, ["items"])
print(df)
结果如下
key ... value 0 time ... 2022-12-13T23:59:59.939-07:00 1 agentNotes ... null 2 blindTransferToAgent ... 0
[3 rows x 3 columns]
但是我试图创建我的键作为列和值作为值,所以最终结果看起来像这样。
time agentNotes blindTransfertoAgent
2022-12-13T23:590:59.939-07:00 null 0
如有任何帮助,不胜感激。
我没有找到这个问题的捷径,也许有人可以给我们一些启发。
然而,解决方案并没有那么长,所以我还是想把它贴出来。
你"JSON"如果我从你的问题中正确阅读,它不是真正的JSON,它是一个包含两个键,total
和items
的字典的列表。items
的值是一个字典列表,因此我们可以遍历这些值并从每个值中取出key
-value
元素:
from collections import defaultdict
import pandas as pd
dict_to_df = defaultdict(list)
dictionaries = [inner_dicts for items_dict in my_json for inner_dicts in items_dict['items']]
for dictionary in dictionaries:
dict_to_df[dictionary['key']].append(dictionary['value'])
df = pd.DataFrame.from_dict(dict_to_df, orient='index').T
print(df)
输出:
time agentNotes blindTransferToAgent
0 2022-12-13T23:59:59.939-07:00 null 0
解释:
- 初始化一个空的defaultdict(默认值为一个列表),我们将把它读入pandas数据框。
- 在JSON"中插入每个
key
的值我们有 - 将字典读入pandas
DataFrame
-如果这些值的长度不相同,则将索引定向并转置。(例如有一个blindTransferToAgent
值1
),如果JSON看起来像:
{
"key": "time",
"label": "Time",
"value": "2022-12-13T23:59:59.939-07:00"
},
{
"key": "agentNotes",
"label": "Agent Notes",
"value": "null"
},
{
"key": "blindTransferToAgent",
"label": "Blind Transfer To Agent",
"value": "0"
},
{
"key": "blindTransferToAgent",
"label": "Blind Transfer To Agent",
"value": "4"
}
将输出:
time agentNotes blindTransferToAgent
0 2022-12-13T23:59:59.939-07:00 null 0
1 None None 4
试着改变这个:
df = pd.json_normalize(my_json, ["items"])
这:
df = pd.json_normalize(my_json, ["items"]).T
Pandas DataFrame对象中的T
属性存储索引和列的调换,这就是您正在寻找的。
输出:
0 1 2
key time agentNotes blindTransferToAgent
label Time Agent Notes Blind Transfer To Agent
value 2022-12-13T23:59:59.939-07:00 null 0