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

基于字典列表条件修改Pandas DataFrame列值的问题

基于字典列表条件为Pandas DataFrame添加列的正确方法

你遇到的问题核心是:直接用Pandas Series和列表做in判断时,Pandas无法解析这种“模糊真值”——因为owners['Location']是包含多行数据的Series,而非单个值,in操作符无法直接对整个Series生效,所以抛出了ValueError。

下面提供两种简洁高效的解决方法,都能实现你要的效果:

方法1:使用apply逐行处理

通过apply对Location列的每个元素单独做判断,生成对应宠物列的Yes/No值:

for pet, allowed_locations in pets.items():
    owners[pet] = owners['Location'].apply(lambda loc: 'Yes' if loc in allowed_locations else 'No')

apply会遍历Location列的每一行,将单个位置值传入lambda函数,判断是否在该宠物允许的地点列表中,返回对应的字符串标记。

方法2:向量化isin操作(推荐,大数据量更高效)

利用Pandas的向量化APIisin批量判断,再将布尔值映射为Yes/No,这种方法避免了逐行循环,性能更优:

for pet, allowed_locations in pets.items():
    # 先生成布尔Series:True表示位置在允许列表中
    is_allowed = owners['Location'].isin(allowed_locations)
    # 将布尔值映射为Yes/No
    owners[pet] = is_allowed.map({True: 'Yes', False: 'No'})

执行任意一种方法后,owners DataFrame都会符合你的预期:

WhoLocationCatsDogsBirds
0JohnNorthYesYesNo
1SaraSouthYesNoYes
2SethEastNoYesYes
3JuneWestNoNoNo

为什么原代码失败?

原代码中owners['Location'] in pets[pet]试图将整个Series与列表做包含判断,Pandas无法确定你要的是“所有位置都在列表中”还是“至少一个位置在列表中”,因此抛出模糊真值的错误。必须针对Series的每个元素单独判断,或者使用Pandas提供的向量化方法来处理批量逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:02:13