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
相关产品推荐
相关产品推荐

