如何以Pythonic方式从嵌套字典列表生成指定结构的DataFrame
从嵌套字典列表结构生成指定格式的DataFrame
给定如下结构的嵌套字典:
data1 = { 'AI': [3, {'G': 0.0, 'C': 0.31666666666666665, 'L': 0.3333333333333333, 'U': 0.0, 'J': 0.0, 'W': 0.0, 'O1': 0.3333333333333333, 'O2': 0.016666666666666666, 'T1': 0.0, 'T2': 0.0, 'N': 0.0, 'B': 0.0, 'R': 0.0, 'D': 0.0, 'M': 0.0}, [0.3333333333333333, 0.3333333333333333, 0.3333333333333333]], 'CY': [96, {'G': 0.010416666666666666, 'C': 0.0, 'L': 0.46875, 'U': 0.0, 'J': 0.010416666666666666, 'W': 0.0, 'O1': 0.41666666666666663, 'O2': 0.020833333333333332, 'T1': 0.0, 'T2': 0.07291666666666666, 'N': 0.0, 'B': 0.0, 'R': 0.0, 'D': 0.0, 'M': 0.0}, [0.3333333333333333, 0.3333333333333333, 0.3333333333333333]], 'PY': [127, {'G': 0.0, 'C': 0.0, 'L': 0.42276422764227645, 'U': 0.008130081300813009, 'J': 0.0, 'W': 0.0, 'O1': 0.4552845528455285, 'O2': 0.04065040650406505, 'T1': 0.0, 'T2': 0.04878048780487805, 'N': 0.020325203252032523, 'B': 0.0040650406504065045, 'R': 0.0, 'D': 0.0, 'M': 0.0}, [0.3333333333333333, 0.3333333333333333, 0.3333333333333333]], 'SR': [1, {'G': 0.0, 'C': 0.0, 'L': 0.0, 'U': 0.0, 'J': 0.0, 'W': 0.0, 'O1': 0.0, 'O2': 1.0, 'T1': 0.0, 'T2': 0.0, 'N': 0.0, 'B': 0.0, 'R': 0.0, 'D': 0.0, 'M': 0.0}, [0.33333333333333337, 0.33333333333333337, 0.33333333333333337]], 'CV': [119, {'G': 0.03022827836191888, 'C': 0.09570154943733565, 'L': 0.1787022898077257, 'U': 0.059038954704106396, 'J': 0.01667767082036904, 'W': 0.0008338835410184519, 'O1': 0.46697478297033307, 'O2': 0.03193607185392467, 'T1': 0.0, 'T2': 0.08238175915743774, 'N': 0.0208470885254613, 'B': 0.00833883541018452, 'R': 0.0, 'D': 0.00833883541018452, 'M': 0.0}, [0.33216690905268464, 0.3354010574206815, 0.3324320335266338]], 'BS': [65, {'G': 0.024576271186440683, 'C': 0.1033898305084746, 'L': 0.08576271186440679, 'U': 0.37796610169491535, 'J': 0.016949152542372885, 'W': 0.0, 'O1': 0.21864406779661022, 'O2': 0.07271186440677968, 'T1': 0.050847457627118654, 'T2': 0.013559322033898308, 'N': 0.016949152542372885, 'B': 0.0016949152542372885, 'R': 0.0, 'D': 0.016949152542372885, 'M': 0.0}, [0.3346524499339513, 0.3346524499339513, 0.33069510013209746]], 'RD': [24, {'G': 0.041666666666666664, 'C': 0.0, 'L': 0.29166666666666663, 'U': 0.0, 'J': 0.0, 'W': 0.0, 'O1': 0.5833333333333333, 'O2': 0.041666666666666664, 'T1': 0.0, 'T2': 0.0, 'N': 0.041666666666666664, 'B': 0.0, 'R': 0.0, 'D': 0.0, 'M': 0.0}, [0.3333333333333333, 0.3333333333333333, 0.3333333333333333]] }
其通用结构为:
d1 = { A1: [n1, {B1: m1, B2: m2, ...}, [p1, q1, r1]], ... }
需要生成一个DataFrame,要求:
- 以字典的顶层键(A类键)作为第一列(行标识)
- 以内部字典的键(B类键)作为列名
- 内部字典的对应值(m值)作为单元格内容
已知所有条目的B类键均一致,求符合Python风格的实现方式。
解决方案
最符合Python风格的实现方式是利用字典推导式提取所需的内层字典,再结合pandas的from_dict方法快速生成DataFrame,步骤如下:
- 提取每个顶层键对应的内层字典(即列表中的第二个元素,索引为1):
import pandas as pd # 提取目标数据:顶层键 -> 内层字典 filtered_data = {key: value[1] for key, value in data1.items()}
- 生成DataFrame,并将顶层键设置为第一列:
# 从字典生成DataFrame,orient='index'表示用字典键作为行索引 df = pd.DataFrame.from_dict(filtered_data, orient='index') # 将行索引转为第一列,并命名列名 df = df.reset_index().rename(columns={'index': 'A类键'})
代码说明
- 字典推导式
{key: value[1] for key, value in data1.items()}简洁高效,直接过滤掉不需要的n值和[p,q,r]列表,只保留需要的内层字典数据,符合Python的简洁性原则。 pd.DataFrame.from_dict(filtered_data, orient='index')直接将字典的键作为行索引,值作为行数据,自动对齐所有B类键作为列名。reset_index()将行索引转为普通列,rename方法给该列设置明确的名称,满足“顶层键作为第一列”的需求。
最终效果
生成的DataFrame结构如下(示例片段):
| A类键 | G | C | L | ... |
|---|---|---|---|---|
| AI | 0.0 | 0.316667 | 0.333333 | ... |
| CY | 0.010417 | 0.0 | 0.46875 | ... |
| ... | ... | ... | ... | ... |
内容的提问来源于stack exchange,提问作者user2751530
相关产品推荐
相关产品推荐

