如何基于多列表匹配为Pandas DataFrame添加层级列?
问题描述
现有如下DataFrame:
d = {'name': ['Tom', 'Patrick', 'Lamar'], 'rating': [100, 97, 95]} df = pd.DataFrame(data=d) print(df)
以及一组层级列表:
tier1 = ['Tom', 'Patrick'] tier2 = ['Lamar']
需要高效创建新的tier列,最终结果如下:
d = {'name': ['Tom', 'Patrick', 'Lamar'], 'rating': [100, 97, 95], 'tier': [1, 1, 2]} df = pd.DataFrame(data=d) print(df)
实际场景中DataFrame约有300行,且包含11个层级列表。尝试过用pd.iterrows()遍历行进行判断,但不确定具体实现;也尝试过构建字典tier_dict = {1: tier1, 2: tier2},但不知道如何将字典键作为新列值。
解决方法
方法1:构建反向映射字典(推荐)
将原层级字典反转,生成名字→层级的映射关系,利用map()方法快速赋值,效率最高,适合大数据量场景:
# 定义层级字典 tier_dict = { 1: ['Tom', 'Patrick'], 2: ['Lamar'] } # 构建反向映射:名字对应层级 name_to_tier = {} for tier_num, names in tier_dict.items(): for name in names: name_to_tier[name] = tier_num # 生成新列 df['tier'] = df['name'].map(name_to_tier)
方法2:使用apply自定义判断逻辑
如果不想额外构建字典,可通过apply()逐行匹配层级,300行数据的场景下完全够用:
def get_tier(name): if name in tier1: return 1 elif name in tier2: return 2 # 依次添加其他11个层级的判断 else: return None # 处理不在任何层级的异常情况 df['tier'] = df['name'].apply(get_tier)
方法3:批量赋值(适合多层级场景)
利用isin()结合loc按层级优先级批量赋值,避免循环:
# 初始化tier列 df['tier'] = None # 按层级顺序赋值(注意:若名字存在于多个层级,后赋值的会覆盖前者,需按优先级排序) df.loc[df['name'].isin(tier1), 'tier'] = 1 df.loc[df['name'].isin(tier2), 'tier'] = 2 # 继续添加剩余9个层级的赋值逻辑
内容的提问来源于stack exchange,提问作者datadraco
相关产品推荐
相关产品推荐

