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

如何基于多列表匹配为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 08:48:33