如何简洁实现Pandas DataFrame中未拥有指定物品的人员筛选
获取未持有指定物品的人员列表(单行实现方案)
原始DataFrame
import pandas as pd import numpy as np df = pd.DataFrame({ 'person': ['Sebastian','Sebastian','Sebastian', 'Maria', 'Maria', 'Maria', 'Achim','Achim','Achim'], 'item': ['house','garden','sink','sink','gold','house','stone','gold','wood'] })
需求
获取所有未持有gold物品的人员列表。
原有实现代码
allPersons = df['person'].unique() personWithGold = df[df['item'] == 'gold']['person'].unique() personWithoutGold = allPersons[~np.isin(allPersons, personWithGold)]
单行实现方案
以下是几种简洁的单行解决方案,可按需选择:
- groupby + filter 方式(可读性优先)
personWithoutGold = df.groupby('person').filter(lambda x: 'gold' not in x['item'].values)['person'].unique()
按person分组后,筛选出组内物品不含gold的分组,最后提取唯一的人员名称。
- transform + 布尔索引 方式
personWithoutGold = df[~df.groupby('person')['item'].transform(lambda x: (x == 'gold').any())]['person'].unique()
通过transform将每组是否包含gold的判断结果映射到原数据的每一行,再反向筛选出符合条件的行,最后提取唯一人员。
- 去重 + 反向isin 方式
personWithoutGold = df['person'].drop_duplicates()[~df['person'].drop_duplicates().isin(df[df['item'] == 'gold']['person'].unique())]
先获取所有去重后的人员列表,再排除掉持有gold的人员。
内容的提问来源于stack exchange,提问作者principal-ideal-domain
相关产品推荐
相关产品推荐

