我正在用python進行分析。我有來自 json 中的 post 請求的回應,我想在進行一些分析之前將幾位資訊提取到 DataFrame 中以與另一個合并。
json 的格式為:
json = {'type': 'abc',
'results': [{'users': [{'id': '1',
'score': 0.9},
{'id': '2',
'score': 0.2}],
'num_users': 2,
'name': 'john smith'},
{'users': [{'id': '3',
'score': 0.7}],
'num_users': 1,
'name': 'david jones'},
{'users': [{'id': '5',
'score': 0.8},
{'id': '6',
'score': 0.3}],
'num_users': 2,
'name': 'jane smith'}]}
在上面的示例中,我想提取名稱,以及它們關聯的 id 和分數:
| 姓名 | id_1 | score_1 | id_2 | score_2 |
|---|---|---|---|---|
| 約翰·史密斯 | 1 | 0.9 | 2 | 0.2 |
| 大衛瓊斯 | 3 | 0.7 | ||
| 簡·史密斯 | 5 | 0.8 | 6 | 0.3 |
我最初的計劃是在創建資料框之前回圈并創建一個字典串列,但是當我這樣做時,我意識到用戶數量和分數會有所不同,最初認為每個名稱應該有 2 個 id 和分數。
scores = []
for i in range(0, len(json):
scores.append({'name':json[i]['name'],
'id_1': json[i]['users'][0]['id'],
'score_1': json[i]['users'][0]['score'],
'id_2': json[i]['users'][1]['id'],
'score_2': json[i]['users'][1]['score']})
pd.DataFrame(scores)
如何根據長度創建具有不同長度和鍵以及不同鍵名(_1、_2 等)的字典?當將可變長度字典串列傳遞給 pd.DataFrame 時,這會起作用嗎?
謝謝。
uj5u.com熱心網友回復:
如果data您的字典來自問題:
df = pd.DataFrame(
[
{"name": d["name"]}
| {
f"{k}_{i}": v
for i, d in enumerate(d["users"], 1)
for k, v in d.items()
}
for d in data["results"]
]
).fillna("")
print(df.to_markdown())
印刷:
| 姓名 | id_1 | score_1 | id_2 | score_2 | |
|---|---|---|---|---|---|
| 0 | 約翰·史密斯 | 1 | 0.9 | 2 | 0.2 |
| 1 | 大衛瓊斯 | 3 | 0.7 | ||
| 2 | 簡·史密斯 | 5 | 0.8 | 6 | 0.3 |
或使用**代替dict | dict:
df = pd.DataFrame(
[
{
"name": d["name"],
**{
f"{k}_{i}": v
for i, d in enumerate(d["users"], 1)
for k, v in d.items()
},
}
for d in data["results"]
]
).fillna("")
uj5u.com熱心網友回復:
您可以使用json_normalize然后pivot:
#get the data you need into a dataframe
df = pd.json_normalize(json["results"],record_path="users",meta="name")
#create a counter to pivot
df["counter"] = df.groupby("name").cumcount().add(1)
#pivot to the desired structure
output = df.pivot("name","counter",["id","score"]).sort_values(by="counter",axis=1).rename_axis(None)
#collapse multi-level header to single level
output.columns = output.columns.map("{0[0]}_{0[1]}".format)
>>> output
id_1 score_1 id_2 score_2
david jones 3 0.7 NaN NaN
jane smith 5 0.8 6 0.3
john smith 1 0.9 2 0.2
uj5u.com熱心網友回復:
您可以快速使用:
>>> pd.json_normalize(json['results'], 'users', 'name')
id score name
0 1 0.9 john smith
1 2 0.2 john smith
2 3 0.7 david jones
3 5 0.8 jane smith
4 6 0.3 jane smith
然后旋轉您的資料框:
out = (pd.json_normalize(json['results'], 'users', 'name')
.assign(colid=lambda x: x.groupby('name')['id'].cumcount().add(1).astype(str))
.pivot('name', 'colid'))
out.columns = out.columns.to_flat_index().map('_'.join).rename(None)
print(out)
# Output
id_1 id_2 score_1 score_2
name
david jones 3 NaN 0.7 NaN
jane smith 5 6 0.8 0.3
john smith 1 2 0.9 0.2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/467324.html
上一篇:使用Jolt使用鍵中的值創建帶有硬編碼鍵和值的JSON陣列
下一篇:根據JSON模式自動設定默認值
