如何根据字典为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,提问作者Евгения
相关产品推荐
相关产品推荐

