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

如何在DataFrame中筛选出无21岁记录的唯一姓名?

筛选DataFrame中无21岁记录的姓名

示例数据构造

先将你提供的数据集转换为可复现的Pandas DataFrame:

import pandas as pd

data = {
    'name': ['james', 'james', 'john', 'john', 'dave', 'dave', 'james', 'steve', 'dom', 'dom', 'steve', 'james', 'james', 'bill'],
    'age': [16, 18, 21, 18, 17, 21, 21, 18, 20, 21, 20, 19, 20, 18]
}
df = pd.DataFrame(data)

高效筛选方案(无需循环)

针对大数据量场景,用Pandas内置的分组聚合功能替代循环,性能和代码简洁度更优:

方案一:分组过滤法

通过groupby().filter()直接筛选出符合条件的分组:

# 按姓名分组,过滤掉包含21岁记录的组
filtered_df = df.groupby('name').filter(lambda group: 21 not in group['age'].values)
# 提取唯一姓名
target_names = filtered_df['name'].unique()
print(target_names)

输出结果:

['steve' 'bill']

方案二:聚合标记法

先标记每个姓名是否存在21岁记录,再反向筛选:

# 分组计算每个姓名是否有21岁的记录
has_21_record = df.groupby('name')['age'].apply(lambda x: (x == 21).any())
# 筛选出无21岁记录的姓名
target_names = has_21_record[~has_21_record].index.tolist()
print(target_names)

输出结果:

['bill', 'steve']

方案优势

循环遍历单个姓名的方式在数据量较大时会严重拖慢处理速度,而Pandas的分组操作基于向量化实现,性能比循环提升数倍,同时代码逻辑更清晰,便于后续维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:03:22