Py学习  »  Python

基于python中另一列中的AND条件在一列中获取值

R Shriya • 3 年前 • 1388 次点击  

下面是python中的数据框,列名为“Order_number”和“item_id”,表示订单号和按该顺序组成的项目。我需要获取由商品ID A和B组成的订单号,所以我的结果应该是订单号12345和84573

订单号 项目编号
12345 A.
12345
34235 B
43543 B
84573 A.
84573 B
45846 A.

我有以下代码,但我得到一个错误:

df[df['item_id'] == 'A' & df['item_id'] == 'B'] 

TypeError: Cannot perform 'rand_' with a dtyped [object] array and scalar of type [bool]
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/133890
 
1388 次点击  
文章 [ 1 ]  |  最新文章 3 年前
enke
Reply   •   1 楼
enke    3 年前

你可以 groupby.apply 一个lambda,用于检查每个“订单号”的唯一“项目id”是否同时包含“a”和“B”;然后过滤那些可以:

out = df.groupby('Order_number')['item_id'].apply(lambda x: {'A','B'}.issubset(x.unique().tolist())).pipe(lambda x: x.index[x]).tolist()

另一个选择是使用 groupby.any 两次一次用于“A”,另一次用于“B”,以创建布尔级数对象,如果 item_id Order_number ; 既然我们想要两者都存在,我们就使用 &

out = (df['item_id'].eq('A').groupby(df['Order_number']).any() & df['item_id'].eq('B').groupby(df['Order_number']).any()).pipe(lambda x: x.index[x].tolist())

输出:

[12345, 84573]