我需要將列中帶有 json 值的以下資料框轉換為資料框柱狀結構,以便占用更少的空間并易于計算。
示例資料幀:
| obs_id | 日期 | 觀測 |
|---|---|---|
| I2213 | 2021-12-31 23:20:02.761008 | "[{'type': 'air', 'results': {'bat': {'F1': 0.1, 'F2': 0.2}}, {'type': 'water', 'results': {'新':{'F1':0.3}}]” |
| I2213 | 2022-01-01 23:20:02.761008 | “[{'type': 'earth', 'results': {'cat': {'F1': 0.4}}]” |
| I2213 | 2022-01-02 23:20:02.761008 | “[{'type': 'air', 'results': {'bat': {'F1': 0.2, 'F2': 0.1}}]” |
所需的轉換格式:
| obs_id | 日期 | obs.air.bat.F1 | obs.air.bat.F2 | obs.water.neo.F1 | obs.earth.cat.F1 |
|---|
不確定多級列是否更適合這里。
我試圖從 obs 列創建一個單獨的資料框,如:
df1 = pd.DataFrame(df['obs'].values.tolist())
但由于它包含串列而不是字典,所以它不起作用。是否有可能實作所需的格式?
uj5u.com熱心網友回復:
讓我們從對源資料的更正開始。由于您的示例包含不平衡的括號,可能它的實際內容應該是:
obs_id date obs
0 I2213 2021-12-31 [{'type': 'air', 'results': {'bat': {'F1': 0.1, 'F2': 0.2}}}, {'type': 'water', 'results': {'neo': {'F1': 0.3}}}]
1 I2213 2022-01-01 [{'type': 'earth', 'results': {'cat': {'F1': 0.4}}}]
2 I2213 2022-01-02 [{'type': 'air', 'results': {'bat': {'F1': 0.2, 'F2': 0.1}}}]
為了保持合理寬度的列印輸出,我從日期列中洗掉了時間部分。
從必要的匯入開始編碼部分:
import pandas as pd
import json
然后定義一個行處理函式為:
def procRow(row):
wrk1 = pd.json_normalize(json.loads(row.obs.replace("'", '"')))
wrk2 = wrk1.set_index('type').stack().reset_index()
return pd.Series(wrk2[0].values, index='obs.' wrk2.type\
wrk2.level_1.str.slice(7))
并將df 的前 2 列與將此函式應用于每一行的結果連接起來:
result = pd.concat([df.iloc[:, 0:2], df.apply(procRow, axis=1)], axis=1)
結果是:
obs_id date obs.air.bat.F1 obs.air.bat.F2 obs.earth.cat.F1 obs.water.neo.F1
0 I2213 2021-12-31 0.1 0.2 NaN 0.3
1 I2213 2022-01-01 NaN NaN 0.4 NaN
2 I2213 2022-01-02 0.2 0.1 NaN NaN
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/403353.html
標籤:
上一篇:javascript:如何使用for回圈獲取json陣列的所有ID
下一篇:JQ在多個檔案中拆分JSON
