You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python嵌套字典构建及多级列DataFrame创建技术求助

从列表构建嵌套字典并生成多级列DataFrame

原始数据

Buildings = ['nr1','nr2','n3']
offices = [1,3,2]
area=[23,[67,77,94],[78,79]]
price=[45,[43,89,56],[54,53]]
employees=[56,[45,54,78],[56,89]]

一、构建目标嵌套字典

注意:你给出的目标字典存在语法错误(外层不能是多个字典的集合),正确结构应为单个外层字典,每个建筑名称作为键,对应值是该建筑下所有办公室的子字典。以下是实现代码:

# 初始化结果字典
building_dict = {}

# 遍历每个建筑的索引
for idx, build in enumerate(Buildings):
    build_key = f"build {build}"
    building_dict[build_key] = {}
    
    # 获取当前建筑的办公室数量
    office_count = offices[idx]
    
    # 将单值数据转为列表,统一遍历逻辑
    current_area = area[idx] if isinstance(area[idx], list) else [area[idx]]
    current_price = price[idx] if isinstance(price[idx], list) else [price[idx]]
    current_employees = employees[idx] if isinstance(employees[idx], list) else [employees[idx]]
    
    # 为每个办公室生成子字典
    for office_num in range(1, office_count + 1):
        office_key = f"office {office_num}"
        building_dict[build_key][office_key] = {
            "area": f"{current_area[office_num-1]} kvm",
            "price": current_price[office_num-1],
            "employees": current_employees[office_num-1]
        }

# 打印结果
print(building_dict)

运行后得到的字典结构符合需求,示例片段:

{
    "build nr1": {
        "office 1": {"area": "23 kvm", "price": 45, "employees": 56}
    },
    "build nr2": {
        "office 1": {"area": "67 kvm", "price": 43, "employees": 45},
        "office 2": {"area": "77 kvm", "price": 89, "employees": 54},
        "office 3": {"area": "94 kvm", "price": 56, "employees": 78}
    },
    ...
}

二、生成带多级列的DataFrame

目标是生成以Buildings nr为索引,一级列为area/price/employees、二级列为办公室编号的DataFrame,提供两种实现方式:

方式1:基于嵌套字典转换

import pandas as pd

# 整理数据为多级列格式
data = {}
for build_key, offices_data in building_dict.items():
    build_nr = build_key.split()[1]  # 提取建筑编号(如"nr1")
    for office_key, metrics in offices_data.items():
        office_nr = int(office_key.split()[1])  # 提取办公室编号(如1)
        for metric, value in metrics.items():
            # 处理area的数值,去掉"kvm"转为数字
            if metric == "area":
                value = int(value.split()[0])
            # 构建多级列的键:(指标名, 办公室编号)
            col_key = (metric, office_nr)
            if col_key not in data:
                data[col_key] = {}
            data[col_key][build_nr] = value

# 生成DataFrame并调整结构
df = pd.DataFrame(data).T.unstack().unstack(level=0)
df.index.name = "Buildings nr"
# 确保列的顺序为area、price、employees
df = df[["area", "price", "employees"]]

print(df)

方式2:直接从原始数据生成(更简洁)

import pandas as pd

# 整理每行数据
rows = []
for idx, build in enumerate(Buildings):
    office_count = offices[idx]
    current_area = area[idx] if isinstance(area[idx], list) else [area[idx]]
    current_price = price[idx] if isinstance(price[idx], list) else [price[idx]]
    current_employees = employees[idx] if isinstance(employees[idx], list) else [employees[idx]]
    
    for office_num in range(1, office_count + 1):
        rows.append({
            "Buildings nr": build,
            "office": office_num,
            "area": current_area[office_num-1],
            "price": current_price[office_num-1],
            "employees": current_employees[office_num-1]
        })

# 透视生成多级列DataFrame
df = pd.DataFrame(rows).pivot(index="Buildings nr", columns="office")
# 调整一级列的顺序
df = df.reindex(columns=["area", "price", "employees"], level=0)

print(df)

运行后得到的DataFrame结构示例:

area        price        employees       
office          1     2     3    1   2   3       1   2   3
Buildings nr                                              
nr1            23   NaN   NaN   45 NaN NaN      56 NaN NaN
nr2            67    77    94   43  89  56      45  54  78
n3             78    79   NaN   54  53 NaN      56  89 NaN

内容的提问来源于stack exchange,提问作者Nunotrt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:01:55