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

Pandas DataFrame转换为多键嵌套字典的两种实现方法

Pandas DataFrame 转换为多层嵌套字典的实现方法

问题背景

示例DataFrame构造代码如下:

import pandas as pd
import datetime

columns = ['country', 'city', 'from_date', 'to_date', 'sales']
data = [
    ['UK', 'London', datetime.date(2021, 8, 26), datetime.date(2099, 5,5), 2500],
    ['Mexico', 'Mexico City', datetime.date(2011, 3,3), datetime.date(2012, 4, 5), 5670],
    ['Mexico', 'Mexico City', datetime.date(2014, 3,3), datetime.date(2017, 4, 5), 5680]
]
df = pd.DataFrame(data, columns=columns)

需实现两种多层嵌套字典的输出格式。

第一种格式实现(国家→城市→销售信息列表)

目标结构:第一层key为国家,第二层key为城市,value为该城市对应所有时间段销售信息的字典列表。
实现代码:

# 统一转换日期列为原生date对象,避免输出Timestamp格式
df[['from_date', 'to_date']] = df[['from_date', 'to_date']].apply(lambda col: col.dt.date)

result1 = {}
for (country, city), group_df in df.groupby(['country', 'city']):
    if country not in result1:
        result1[country] = {}
    # 保留所需字段转换为字典列表
    result1[country][city] = group_df[['from_date', 'to_date', 'sales']].to_dict('records')

第二种格式实现(国家→城市→起始日期→销售额)

目标结构:第一层key为国家,第二层key为城市,第三层key为from_date,value为对应销售额。
你之前的代码得到元组key的扁平结构,是因为三级groupby生成的MultiIndex会被to_dict默认转为元组作为key,用嵌套分组处理即可实现嵌套结构:

# 统一转换日期列为原生date对象,方便后续直接做日期比对
df['from_date'] = df['from_date'].dt.date

result2 = {}
for (country, city), group_df in df.groupby(['country', 'city']):
    if country not in result2:
        result2[country] = {}
    # 以from_date为索引,取销售额列直接转字典
    result2[country][city] = group_df.set_index('from_date')['sales'].to_dict()

如果需要销售额为float类型,可将最后一行修改为:

result2[country][city] = group_df.set_index('from_date')['sales'].astype(float).to_dict()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:12:03