這是我的示例資料,其中包含兩個欄位,其中最后一個 [爆發] 是熊貓系列。
開始:

目標(Excel 模型):

復制代碼:
import pandas as pd
import json
d = {'report_id': [100, 101], 'outbreak': [
'{"outbreak_100":{"name":"Chris","disease":"A-Pox"},"outbreak_101":{"name":"Stacy","disease": "H-Pox"}}',
'{"outbreak_200":{"name":"Brandon","disease":"C-Pox"},"outbreak_201":{"name":"Karen","disease": "G-Pox"},"outbreak_202":{"name":"Tim","disease": "Z-Pox"}}']}
df = pd.DataFrame(data=d)
print(type(df['outbreak']))
display(df)
#Ignore
df = pd.json_normalize(df['outbreak'].apply(json.loads), max_level=0)
display(df)
嘗試:我考慮使用 json_normalize() 將每個 [outbreak_id] 轉換為自己的欄位,然后使用 pandas.wide_to_long() 來獲得我的最終輸出。它在測驗中有效,但我擔心的是我的實際生產資料是如此長且嵌套,以至于它最終會在旋轉之前生成數十萬個欄位。這對我來說聽起來不太好,為什么我也希望避免回圈迭代。
我也考慮過使用 df = df.explode('outbreak') 但我得到一個 KeyError: 0
也許有人比我有更好的主意?謝謝你。
uj5u.com熱心網友回復:
試試這個
import json
d = {'report_id': [100, 101], 'outbreak': [
'{"outbreak_100":{"name":"Chris","disease":"A-Pox"},"outbreak_101":{"name":"Stacy","disease": "H-Pox"}}',
'{"outbreak_200":{"name":"Brandon","disease":"C-Pox"},"outbreak_201":{"name":"Karen","disease": "G-Pox"},"outbreak_202":{"name":"Tim","disease": "Z-Pox"}}']}
df = pd.DataFrame(data=d)
# use json.loads to parse the json and construct df from it
df = pd.DataFrame(df.set_index('report_id')['outbreak'].map(json.loads).to_dict()).stack().rename_axis(['outbreak_id', 'report_id'], axis=0).reset_index(name='outbreak_value')
print(df)
outbreak_id report_id outbreak_value
0 outbreak_100 100 {'name': 'Chris', 'disease': 'A-Pox'}
1 outbreak_101 100 {'name': 'Stacy', 'disease': 'H-Pox'}
2 outbreak_200 101 {'name': 'Brandon', 'disease': 'C-Pox'}
3 outbreak_201 101 {'name': 'Karen', 'disease': 'G-Pox'}
4 outbreak_202 101 {'name': 'Tim', 'disease': 'Z-Pox'}
uj5u.com熱心網友回復:
您可以嘗試使用astconvert to dictformat ,然后我們進行轉換
import ast
out = df.pop('outbreak').map(ast.literal_eval).apply(pd.Series).stack().reset_index(level=1).join(df)
out.columns = ['outbreak_id','outbreak_value','report_id']
Out[157]:
level_1 0 report_id
0 outbreak_100 {'name': 'Chris', 'disease': 'A-Pox'} 100
0 outbreak_101 {'name': 'Stacy', 'disease': 'H-Pox'} 100
1 outbreak_200 {'name': 'Brandon', 'disease': 'C-Pox'} 101
1 outbreak_201 {'name': 'Karen', 'disease': 'G-Pox'} 101
1 outbreak_202 {'name': 'Tim', 'disease': 'Z-Pox'} 101
uj5u.com熱心網友回復:
一種方法是將每次爆發的 json 轉換為字典,列出所有字典鍵/值對的串列,然后分解該串列并將值轉換為所需的兩個列:
df['outbreak'] = df['outbreak'].apply(lambda v:json.loads(v).items())
df = df.explode('outbreak')
df[['outbreak_id', 'outbreak_value']] = pd.DataFrame(df.pop('outbreak').tolist(), index=df.index)
輸出(用于您的樣本資料):
report_id outbreak_id outbreak_value
0 100 outbreak_100 {'name': 'Chris', 'disease': 'A-Pox'}
0 100 outbreak_101 {'name': 'Stacy', 'disease': 'H-Pox'}
1 101 outbreak_200 {'name': 'Brandon', 'disease': 'C-Pox'}
1 101 outbreak_201 {'name': 'Karen', 'disease': 'G-Pox'}
1 101 outbreak_202 {'name': 'Tim', 'disease': 'Z-Pox'}
注意:如果outbreak值已經是dicts,不是JSON,將此代碼的第一行更改為:
df['outbreak'] = df['outbreak'].apply(dict.items)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/479600.html
下一篇:從資料框到嵌套字典
