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

如何根据字典为Pandas DataFrame添加布尔值新列?

解决Pandas新增列判断元素归属问题

需求说明

为Pandas DataFrame新增一列New_col,值为布尔类型(True/False),判断逻辑:每行的Item是否属于其Group在字典my_dict中对应的元素集合。

初始代码

import pandas as pd

my_dict={
    'Group1':('Item1','Item3'),
    'Group2':('Item2','Item3','Item4','Item5'),
    'Group3':('Item1')  # 注意:此处定义的是字符串,而非单元素元组,需加逗号修正为('Item1',)
        }

df=pd.DataFrame({
            'Item':['Item1','Item2','Item3','Item4'],
            'Group':['Group1','Group1','Group2','Group3']
               })

期望结果

df=pd.DataFrame({
            'Item':['Item1','Item2','Item3','Item4'],
            'Group':['Group1','Group1','Group2','Group3'],
            'New_col':[True,False,True,False]
               })

错误尝试及报错

用户尝试代码:

df['New_col']=df['Item'].str.startswith(df['Group'].apply(lambda x: my_dict.get(x)))

报错信息(中文翻译):

TypeError: 预期是字符串或元组,而非Series

错误原因

str.startswith()方法仅接受单个字符串或字符串元组作为参数,而df['Group'].apply(...)返回的是Series对象,类型不匹配导致报错;同时该方法逻辑不符合需求——我们需要判断元素是否属于集合,而非是否以某个字符串开头。

正确解决方案

方法1:使用apply逐行判断

先修正字典中Group3的定义(避免将字符串误认为单元素元组),再通过apply遍历每行完成判断:

# 修正字典格式
my_dict={
    'Group1':('Item1','Item3'),
    'Group2':('Item2','Item3','Item4','Item5'),
    'Group3':('Item1',)
        }

# 新增判断列
df['New_col'] = df.apply(lambda row: row['Item'] in my_dict[row['Group']], axis=1)

方法2:映射Group到集合后批量判断

先通过map将Group列转换为对应的元素集合,再批量判断Item的归属(更适合大数据集):

# 修正字典格式
my_dict={
    'Group1':('Item1','Item3'),
    'Group2':('Item2','Item3','Item4','Item5'),
    'Group3':('Item1',)
        }

# 映射Group到对应集合,再逐一判断Item是否在集合中
group_sets = df['Group'].map(my_dict)
df['New_col'] = [item in s for item, s in zip(df['Item'], group_sets)]

运行上述任意方法后,即可得到符合预期的DataFrame。

内容的提问来源于stack exchange,提问作者Евгения

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 01:29:57