我有以下json:
{
"meta": {
"collection": 0
},
"series": {
"default": {
"data": {
"columns": [
{
"columnName": "A",
"columnType": "STRING"
},
{
"columnName": "B",
"columnType": "STRING"
}
],
"rows": [
[
{
"columnName": "A",
"value": "X1"
},
{
"columnName": "B",
"value": "Y1"
}
],
[
{
"columnName": "A",
"value": "X2"
},
{
"columnName": "B",
"value": "Y2"
}
]
]
}
}
}
}
我正在嘗試將此 json 決議為一個資料框,該資料框應如下所示:
A B
--------
X1 Y1
X2 Y2
這是我到目前為止所嘗試的:
import pandas as pd
results = {"meta":{"collection":0},"series":{"default":{"data":{"columns":[{"columnName":"A","columnType":"STRING"},{"columnName":"B","columnType":"STRING"}],"rows":[[{"columnName":"A","value":"X1"},{"columnName":"B","value":"Y1"}],[{"columnName":"A","value":"X2"},{"columnName":"B","value":"Y2"}]]}}}}
s = results["series"]["default"]["data"]
df = pd.json_normalize(s, record_path=["rows"])
問題是 df 中的列包含 json 陣列,而不是值
0 1
0 {'columnName': 'A', 'value': 'X1'} {'columnName': 'B', 'value': 'Y1'}
1 {'columnName': 'A', 'value': 'X2'} {'columnName': 'B', 'value': 'Y2'}
反正有沒有使用 json_normalize 來達到我想要的結果,還是自己通過 json 決議是要走的路?
uj5u.com熱心網友回復:
一種選擇是stack它并使用堆疊的系列創建一個 DataFrame 和pivot它:
out = (pd.DataFrame(my_data['series']['default']['data']['rows'])
.stack()
.pipe(lambda x: pd.DataFrame(x.tolist(), index=x.index))
.reset_index(level=0)
.pivot('level_0','columnName','value')
.rename_axis(index=[None], columns=[None]))
一個更簡單(并且可能更有效)的解決方案是在 Pythondict.setdefault中使用嵌套回圈重新格式化資料;然后構建資料框:
tmp = {}
for lst in my_data['series']['default']['data']['rows']:
for d in lst:
tmp.setdefault(d['columnName'], []).append(d['value'])
out = pd.DataFrame(tmp)
輸出:
A B
0 X1 Y1
1 X2 Y2
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/465579.html
