如何基于defaultdict构建含id2列的DataFrame并兼容缺失键?
问题:用defaultdict生成带查找列的DataFrame并处理键缺失
我原本可以通过defaultdict(命名为output)创建包含'id'和'value'两列的DataFrame,代码如下:
df_mydata = pd.DataFrame([(k, v) for k, v in output.items()], columns=['id', 'value'])
现在我希望生成包含'id'、'id2'和'value'三列的DataFrame,其中'id2'的值通过独立定义的查找字典id_lookup获取。我尝试了以下代码,但运行时出现KeyError:
df_mydata = pd.DataFrame([(k, id_lookup[k], v) for k, v in output.items()], columns=['id', 'id2','value'])
由于无法提前确认id_lookup是否包含所有可能出现的键,我希望将匹配失败的项设为'N/A'。请问上述方案是否适用于通过defaultdict和查找字典生成新列?以及如何让代码对键缺失情况具备鲁棒性?
回答
你的核心思路完全可行,问题出在直接使用id_lookup[k]会在键不存在时抛出KeyError。以下两种方法可以解决这个问题:
方法1:在列表推导式中使用字典get()方法
字典的get()方法允许你指定键不存在时的默认值,直接修改列表推导式即可:
df_mydata = pd.DataFrame([(k, id_lookup.get(k, 'N/A'), v) for k, v in output.items()], columns=['id', 'id2','value'])
当k不在id_lookup中时,get()会返回你指定的'N/A',不会抛出异常。
方法2:先生成基础DataFrame,再添加'id2'列
如果你更倾向分步处理,可以先保留原代码生成两列的DataFrame,再通过apply()结合get()添加新列:
# 生成基础DataFrame df_mydata = pd.DataFrame([(k, v) for k, v in output.items()], columns=['id', 'value']) # 添加id2列,缺失值填充为'N/A' df_mydata['id2'] = df_mydata['id'].apply(lambda x: id_lookup.get(x, 'N/A'))
这种方式可读性更强,后续如果需要对列做更多处理会更灵活。
两种方法都能实现你的需求,根据个人代码风格选择即可。
内容的提问来源于stack exchange,提问作者Arash Howaida
相关产品推荐
相关产品推荐

