如何用Pandas多列值生成元组键字典并补全缺失值
高效构建含默认值的元组键字典(基于Pandas DataFrame)
需求说明
需要将DataFrame中的Factory和Warehouse列值组合为元组键,Dist Fact-Whse列值作为对应字典值;对于所有Factory与Warehouse的可能组合中不存在的键对,需赋值默认值(如9999)。原手动循环实现繁琐低效,需更优雅高效的方案。
示例数据
| Periods(Days) | Factory | Warehouse | Sales Outlets | Products | Dist Fact-Whse | |
|---|---|---|---|---|---|---|
| 0 | 1 | Berlin | Teltow | Magdeburg | Maracuja | 19.6 |
| 1 | 2 | Hamburg | Wismar | Lubeck | Himbeer | 126.2 |
| 2 | 3 | Berlin | Kleinmachnow | Halle | Malaga | 26.9 |
| 3 | 4 | Hamburg | Wismar | Lubeck | Waldmeister | 126.2 |
| 4 | 5 | Berlin | Kleinmachnow | Leipzig | Walnuss | 26.9 |
原实现代码(低效)
F = df.Factory.drop_duplicates().to_list() W = df.Warehouse.drop_duplicates().to_list() dist1 = {}; for i in df.index: key = (df.at[i, 'Factory'], df.at[i, 'Warehouse']) value = df.at[i, 'Dist Fact-Whse'] dicT = {key : value} dist1.update(dicT) for f in F: for w in W: if (f, w) not in dist1: dist1[(f, w)] = 9999
高效解决方案
方法1:利用Pandas透视表+栈式转换
借助pivot_table自动生成所有Factory-Warehouse组合,填充默认值后直接转为字典:
import pandas as pd # 先对重复的(Factory,Warehouse)对去重(保留第一个匹配值) df_unique = df.drop_duplicates(subset=['Factory', 'Warehouse']) # 生成透视表,自动补全所有组合并填充默认值 pivot_df = df_unique.pivot_table( index='Factory', columns='Warehouse', values='Dist Fact-Whse', fill_value=9999 ) # 转换为元组键的字典 dist_dict = pivot_df.stack().to_dict()
方法2:迭代工具生成全组合+字典推导
用itertools.product生成所有可能的键对,结合字典推导快速构建:
import pandas as pd from itertools import product # 获取唯一的工厂和仓库列表 factories = df['Factory'].unique() warehouses = df['Warehouse'].unique() # 先构建已存在的键值对字典(去重) existing_pairs = df.drop_duplicates(subset=['Factory', 'Warehouse'])\ .set_index(['Factory', 'Warehouse'])['Dist Fact-Whse']\ .to_dict() # 生成全组合,不存在的键对用默认值填充 dist_dict = {pair: existing_pairs.get(pair, 9999) for pair in product(factories, warehouses)}
期望结果
{ ('Berlin', 'Teltow'): 19.6, ('Berlin', 'Kleinmachnow'): 26.9, ('Berlin', 'Wismar'): 9999, ('Hamburg', 'Teltow'): 9999, ('Hamburg', 'Kleinmachnow'): 9999, ('Hamburg', 'Wismar'): 126.2 }
内容的提问来源于stack exchange,提问作者Vondoe79
相关产品推荐
相关产品推荐

