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

时间:2019-12-05 13:52:52

标签: 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

这些列包含nameproduct

如何选择具有多个产品的name,例如产品ABC。换句话说,我希望Peter拥有ABC,但没有Jake,因为他只有AB

编辑:我不希望name具有A,B和C,但我只想看看它们是否具有AB和{ {1}}。因此,如果Peter拥有C(示例中未包含),也很好。

我尝试过:

D

但这不会产生任何结果。

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

这只是连接行。

4 个答案:

答案 0 :(得分:4)

如果要测试,每个组正好具有3个唯一的list值,则将boolean indexingset的anf过滤器进行比较:

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

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

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

答案 1 :(得分:3)

这是isinfilter的一种方式-但如果数据量大,速度会很慢:

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

根据他提供的'Product' : ['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: []

答案 2 :(得分:2)

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

答案 3 :(得分:0)

问题尚不清楚,我认为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