如何在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
相关产品推荐
相关产品推荐

