Python pandas按Tag分组选取未被使用的首个Class值的实现方法
实现方案
实现思路
因为需要按Tag的处理顺序动态记录已使用的Class值,普通的drop_duplicates无法满足动态判重的需求,所以用遍历+已使用集合的方式实现:
- 先按Tag分组,保留每个Tag对应的Class在原始数据中的出现顺序
- 初始化集合记录已经被分配过的Class值
- 按顺序遍历每个Tag的Class列表,优先选取第一个未被使用的Class值,若所有值都已被使用则跳过该Tag
代码实现
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'Tag': ['A', 'A', 'B', 'B', 'C', 'C', 'C'], 'Class': ['P', 'Q', 'P', 'Q', 'P', 'Q', 'R'] }) # 按Tag分组,sort=False保证Tag顺序和原数据首次出现顺序一致,不需要按字母排序可删除该参数 tag_class_map = df.groupby('Tag', sort=False)['Class'].apply(list) used_classes = set() result = [] for tag, class_list in tag_class_map.items(): selected = None for cls in class_list: if cls not in used_classes: selected = cls used_classes.add(cls) break if selected: result.append({"Tag": tag, "Class": selected}) # 转换为最终DataFrame result_df = pd.DataFrame(result) print(result_df)
运行上述代码输出的result_df就是你需要的结果:
Tag Class 0 A P 1 B Q 2 C R
如果某个Tag的所有Class都已经被分配过,该Tag不会出现在最终结果中,符合需求。
内容的提问来源于stack exchange,提问作者Thelonious Monk
相关产品推荐
相关产品推荐

