Python 选择希望列中的值具有多个值的行

Python 选择希望列中的值具有多个值的行,python,pandas,dataframe,select,Python,Pandas,Dataframe,Select,我有一个多列的数据框 df= pd.DataFrame({ 'Name': ['Peter', 'Peter', 'Peter', 'Jake', 'Jake'], 'Product' : ['A', 'B', 'C', 'A', 'B'] }) Name Product 0 Peter A 1 Peter B 2 Peter C 3 Jake A 4 Jake B 这些列有名称和产品

我有一个多列的数据框

df= pd.DataFrame({
    'Name': ['Peter', 'Peter', 'Peter', 'Jake', 'Jake'],
    'Product' : ['A', 'B', 'C', 'A', 'B']
    })


    Name Product
0  Peter       A
1  Peter       B
2  Peter       C
3   Jake       A
4   Jake       B
这些列有
名称
产品

如何选择具有多个产品的
名称
s,例如产品
A
B
C
。换句话说,我想要彼得,他有
A
B
C
,但不想要杰克,因为他只有
A
B

编辑:我不希望
name
s只有A、B和C,但我只想看看它们是否有
A
B
C
。因此,如果Peter有
D
(未包含在样本中),也可以

我试过:

df[(df.Product == 'A') & (df.Product == 'B') & (df.Product == 'C')]
但这不会产生任何结果

df[(df.Product == 'A') | (df.Product == 'B') | (df.Product == 'C')]

这一个只是连接行。

如果需要测试,每个组正好有3个列表的唯一值,然后比较
set
s并通过以下方式进行筛选:

如果需要列表的测试值与任何其他值:

df= pd.DataFrame({
    'name': ['Peter', 'Peter', 'Peter', 'Peter', 'Jake'],
    'product' : ['A', 'B', 'C', 'D', 'B']
    })
lst = list(['A','B','C'])

df = df[df.groupby('name')['product'].transform(lambda x: set(x) >= set(lst))]
print (df)
    name product
0  Peter       A
1  Peter       B
2  Peter       C
3  Peter       D

IIUC和给定名称应包含所有产品,您可以使用
nunique
计算唯一产品的数量。然后检查按
name
分组时,该组中的唯一计数是否与整列中的计数相同:

prods = df['product'].nunique()
df[df.groupby('name')['product'].transform('nunique').eq(prods)]


    name    product
0  Peter       A
1  Peter       B
2  Peter       C

这里有一种方法
isin
filter
,但如果数据较大,则速度较慢:

df=df.groupby('Name').filter(lambda x : pd.Series(['A','B','C']).isin(x['Product']).all())
df
    Name Product
0  Peter       A
1  Peter       B
2  Peter       C
来自Jez的测试用例

df= pd.DataFrame({
    'Name': ['Peter', 'Peter', 'Peter', 'Jake', 'Jake','Jake'],
    'Product' : ['A', 'B', 'C', 'A', 'B','A']
    })
df.groupby('Name').filter(lambda x : pd.Series(['A','B','C']).isin(x['Product']).all())
    Name Product
0  Peter       A
1  Peter       B
2  Peter       C
根据他提供的
“产品”:['A','A','C','A','B','A']

df.groupby('Name').filter(lambda x : pd.Series(['A','B','C']).isin(x['Product']).all())
Empty DataFrame
Columns: [Name, Product]
Index: []

问题不清楚,我假设OP对所有
A、B、C
产品感兴趣。然后我们可以做:

s = (df.groupby('Name')['Product']
       .transform(lambda x: x.value_counts()
                          [['A','B','C']].gt(0).all()
                 )
    )

df[s]
输出:

    Name Product
0  Peter       A
1  Peter       B
2  Peter       C

您可以通过一个子选择将其存档:
其中SELECT COUNT(*)XX>1
A和B不是多个产品吗?@jezrael为什么?速度的原因?@jezrael看到测试了吗case@IvanLibedinsky嗨,伙计谢谢你的支持,使用起来很安全。:-)只是速度有点慢。:-)@Mataunited18-yop,原因是
过滤器
在pandas中速度很慢…@Mataunited18-OK,很高兴编码。如果小数据使用任何解决方案;)我理解的方式是保留所有产品都指定的产品。但我可能错了,这一部分并没有明确规定,那么什么是多个产品呢?对你来说,这似乎是一个明确的价值观吗?在每种情况下,是否由OP定义?是独特的产品吗?如果是这样的话,只需将
df['product'].nunique()
更改为产品@juanWell的指定
set
的长度,如果这是op想要的,那么解决方案将是预定义一个产品列表。但是,对我来说,这是不清楚的
    Name Product
0  Peter       A
1  Peter       B
2  Peter       C