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