如何将指定字典转为保留嵌套值的单行Pandas DataFrame
嵌套字典转单行Pandas DataFrame的解决方案
有如下嵌套字典,需要转换为仅包含key、metrics、collectionPeriod三列的单行Pandas DataFrame,保留各列的嵌套值后续处理:
res = { 'key': {'formFactor': 'PHONE', 'origin': 'https://www.sample'}, 'metrics': { 'cumulative_layout_shift': { 'histogram': [ {'start': '0.00', 'end': '0.10', 'density': 0.7861256879559706}, {'start': '0.10', 'end': '0.25', 'density': 123}, {'start': '0.25', 'density': 111} ], 'percentiles': {'p75': '0.07'} }, 'experimental_interaction_to_next_paint': { 'histogram': [ {'start': 0, 'end': 200, 'density': 0.5416453755748598}, {'start': 200, 'end': 500, 'density': 1}, {'start': 500, 'density': 23} ], 'percentiles': {'p75': 504} }, 'experimental_time_to_first_byte': { 'histogram': [ {'start': 0, 'end': 800, 'density': 123}, {'start': 800, 'end': 1800, 'density': 123}, {'start': 1800, 'density': 23} ], 'percentiles': {'p75': 877} }, 'first_contentful_paint': { 'histogram': [ {'start': 0, 'end': 1800, 'density': 22}, {'start': 1800, 'end': 3000, 'density': 664}, {'start': 3000, 'density': 67} ], 'percentiles': {'p75': 1662} }, 'first_input_delay': { 'histogram': [ {'start': 0, 'end': 100, 'density': 234}, {'start': 100, 'end': 300, 'density': 44}, {'start': 300, 'density': 555} ], 'percentiles': {'p75': 34} }, 'largest_contentful_paint': { 'histogram': [ {'start': 0, 'end': 2500, 'density': 0.7725250984877367}, {'start': 2500, 'end': 4000, 'density': 777}, {'start': 4000, 'density': 544} ], 'percentiles': {'p75': 2352} } }, 'collectionPeriod': { 'firstDate': {'year': 2022, 'month': 10, 'day': 14}, 'lastDate': {'year': 2022, 'month': 11, 'day': 10} } }
使用pd.DataFrame.from_dict(res, orient='columns')转换后,DataFrame会以key的嵌套值(formFactor、origin)作为索引,不符合单行三列的需求。
错误原因
orient='columns'会将字典中每个顶层key对应的嵌套字典的键作为行索引,把顶层key作为列,导致生成的DataFrame行数等于嵌套字典的键数量,而非单行。
解决方案
方法1:将字典包装为列表直接构造
把原字典放入列表中,Pandas会将列表中的每个元素作为一行数据:
import pandas as pd df = pd.DataFrame([res])
方法2:使用orient='index'并转置
先以顶层key为行构造DataFrame,再转置为列:
df = pd.DataFrame.from_dict(res, orient='index').T
方法3:手动指定列和行数据
直接构造包含目标列的DataFrame,将每个顶层key对应的嵌套结构作为单元格值:
df = pd.DataFrame({ 'key': [res['key']], 'metrics': [res['metrics']], 'collectionPeriod': [res['collectionPeriod']] })
验证结果
以上任意方法生成的DataFrame均为单行,包含key、metrics、collectionPeriod三列,每列保留原始嵌套结构,符合需求。示例验证代码:
print(df.shape) # 输出 (1, 3) print(df.columns) # 输出 Index(['key', 'metrics', 'collectionPeriod'], dtype='object')
内容的提问来源于stack exchange,提问作者KristiLuna
相关产品推荐
相关产品推荐

