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

如何简洁实现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)]

单行实现方案

以下是几种简洁的单行解决方案,可按需选择:

  1. groupby + filter 方式(可读性优先)
personWithoutGold = df.groupby('person').filter(lambda x: 'gold' not in x['item'].values)['person'].unique()

按person分组后,筛选出组内物品不含gold的分组,最后提取唯一的人员名称。

  1. transform + 布尔索引 方式
personWithoutGold = df[~df.groupby('person')['item'].transform(lambda x: (x == 'gold').any())]['person'].unique()

通过transform将每组是否包含gold的判断结果映射到原数据的每一行,再反向筛选出符合条件的行,最后提取唯一人员。

  1. 去重 + 反向isin 方式
personWithoutGold = df['person'].drop_duplicates()[~df['person'].drop_duplicates().isin(df[df['item'] == 'gold']['person'].unique())]

先获取所有去重后的人员列表,再排除掉持有gold的人员。

内容的提问来源于stack exchange,提问作者principal-ideal-domain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:20:43