Pandas 规范化dataframe中的列

Pandas 规范化dataframe中的列,pandas,Pandas,我可以使用以下代码从json文件导入数据 import requests from pandas.io.json import json_normalize url = "https://datameetgeobk.s3.amazonaws.com/image_list.json" resp = requests.get(url=url) df = json_normalize(resp.json()['Images']) df.head() 但“BlockDeviceMappings”列

我可以使用以下代码从json文件导入数据

import requests
from pandas.io.json import json_normalize

url = "https://datameetgeobk.s3.amazonaws.com/image_list.json"

resp = requests.get(url=url)
df = json_normalize(resp.json()['Images'])
df.head()
但“BlockDeviceMappings”列实际上是一个列表,每个项都有DeviceName和Ebs参数,即string和dicts。我如何进一步规范化我的数据帧,以便在单独的列中包含所有细节


我的截图与答案中显示的截图不匹配。Ebs列(左二)是一个字典

到目前为止,您所拥有的: 块设备应用程序强制转换到所有列 分开
bdm\u df
您无疑会想知道为什么
df
有39995个条目,而
bdm_df
有131691个条目。这是因为
BlockDeviceMappings
是一个长度不等的
目录的
列表:

bdm_len = [len(x) for x in df.BlockDeviceMappings]
max(bdm_len)
>>> 31
示例
BlockDeviceMappings
条目:
df_bdm.head()

是的,你是对的。因为这个杰出的回答而获得赏金。
df = json_normalize(resp['Images'])
inner_keys = [x for x in resp['Images'][0].keys() if x != 'BlockDeviceMappings']

df_bdm = json_normalize(resp['Images'], record_path=['BlockDeviceMappings'], meta=inner_keys, errors='ignore')
bdm_df = json_normalize(resp['Images'], record_path=['BlockDeviceMappings'])
bdm_len = [len(x) for x in df.BlockDeviceMappings]
max(bdm_len)
>>> 31
[{'DeviceName': '/dev/sda1',
  'Ebs': {'DeleteOnTermination': True,
   'SnapshotId': 'snap-0aac2591b85fe677e',
   'VolumeSize': 80,
   'VolumeType': 'gp2',
   'Encrypted': False}},
 {'DeviceName': 'xvdb',
  'Ebs': {'DeleteOnTermination': True,
   'SnapshotId': 'snap-0bd8d7828225924a7',
   'VolumeSize': 80,
   'VolumeType': 'gp2',
   'Encrypted': False}}]